自然语言处理(NLP)-深度学习自然语言处理
- 数据预处理
- 词向量
- Attention机制
- 文本分类
- 命名实体识别
- 文本匹配
- 预训练语言模型
- 阅读理解
- 自然语言推理
- 关系抽取
- 实体链接
- 文本摘要
- 文本生成
- 关键词抽取
- 开放域对话
- 多模态命名实体识别
- 模型压缩
- 中英文分词
- 任务型对话
数据预处理
NLP 数据增强方法
https://zhuanlan.zhihu.com/p/75207641
https://www.qbitai.com/2020/06/16103.html
https://www.dataapplab.com/enhance-nlp-what-are-the-easiest-use-augmentation-techniques/
文本替代
- 同义词替代:
- 词嵌入替换: 采用嵌入空间中最近的邻接词作为句子中某些单词的替换
- 掩码语言模型:通过bert等这种MLM模型来预测被mask掉的词来做替换,需要注意的是决定哪一个单词被mask是比较重要的
1. OOV - out of vocabulary words
- 采用细粒度的表示 + 粗粒度的表示融合:彻底消灭所有 OOV
- Wordpiece Model: 无法彻底解决OOV
<UNK>处理- 扩大词表
2. 数据增强
词向量
https://zhuanlan.zhihu.com/p/29364112
Word2Vec[3]
Word2Vec是Google发布的一个工具, 用于训练词向量,其提供了两种语言模型来供选择, 且Google 基于大规模语料集上训练出了预训练词向量来供开发者或研究者使用。 一般情况下,我们是没有必要自己去训练词向量的,但如果要求特殊,且语料集庞大,自己训练也是可以的。
在Word2Vec中,实现了两个模型:CBOW 与 Skip-Gram。
1. CBOW模型
CBOW,全称Continuous Bag-of-Word,中文叫做连续词袋模型:以上下文来预测当前词

如上图是一个两层的神经网络,其实在训练语言模型的过程中考虑到效率等问题,常常采用浅层的神经网络来训练,并取第一层的参数如上图就是
CBOW模型的目的是预测
1. 前向传播过程
输入层: 输入C个单词:
,并且每个 都是用 One-hot 编码表示,每一个 的维度为 V(词表长度)。 输入层到隐层: 共享矩阵为
,V表示词表长度,W的每一行表示的就是一个N维的向量(训练结束后,W的每一行就表示一个词的词向量)。在隐藏层中,我们的所有输入的词转化为对应词向量,然后取平均值,这样我们就得到了隐层输出值 ( 注意,隐层中无激活函数,也就是说这里是线性组合)。 其中,隐层输出 是一个N维的向量 。 隐层到输出层:隐层的输出为N维向量
, 隐层到输出层的权重矩阵为 。然后,通过矩阵运算我们得到一个 维向量
其中,向量
2. 损失函数
我们假定
2. Skip-gram模型
Skip-Gram的基本思想是:已知当前词

1. 前向传播过程:
输入层: 输入的是一个单词,其表示形式为 One-hot ,我们将其表示为V维向量
,其中 为词表大小。然后,通过词向量矩阵 我们得到一个N维向量 隐层: 而隐层中没有激活函数,也就是说输入=输出,因此隐藏的输出也是
。 隐层到输出层:
- 首先,因为要输出C个单词,因此我们此时的输出有C个分布:
,且每个分布都是独立的,我们需要单独计算, 其中 表示窗口的第 个单词的分布。 - 其次, 因为矩阵
是共享的,因此我们得到的 维向量 其实是相同的,也就是有 ,这里 的每一行同 CBOW 中一样,表示的也是评分。 - 最后,每个分布都经过一个 softmax 层,不同于 CBOW,我们此处产生的是第
个单词的分布(共有C个单词),如下:
- 首先,因为要输出C个单词,因此我们此时的输出有C个分布:
2. 损失函数
假设
3. 模型复杂度
本节中我们来分析一下模型训练时的复杂度,无论是在CBOW还是Skip-Gram模型中,都需要学习两个词向量矩阵:
对于矩阵
对于
在现实中,用于语言模型训练的数据集通常都很大,此外词表也是巨大的,这就导致对于
为了解决优化起来速度太慢的问题, Word2Vec 中提供了两种策略来对这方面进行优化。
4. Hierarchical Softmax
HS 基于哈夫曼树将计算量大的部分转化为一种二分类问题。

原先的模型中,模型再隐层之后通过
用
那么就有:
:指示函数,条件成立值为1, 反之为 -1 :表示整条路径的长度
这样我们就能够通过训练来更新每个非叶子节点的参数
且需要注意的时,再一个非叶子节点处, 向左向右的概率和为1, 因此一直分裂下去,最后的和肯定还是1, 因此可以得出:
损失函数同样为最大似然:
通过 HS, 隐层到输出层的计算量从
2. Negative Sampling – 负采样
在 Word2Vec 中, 对于输出层来说,我每一个输出节点都要预测词表中所有词在当前位置的概率,在动辄几万甚至几十万大的词表中,用softmax 计算真的十分困难。
但我们的目的不在于训练一个精准的语言模型,而只是为了训练得到语言模型的副产物-词向量,那么我们可不可以把输出压缩呢,将几万的输出压缩到几十程度,这计算量是成几何倍数的下降。
负采样的思路很简单,不直接让模型从整个词表中找最可能的词,而是直接给定这个词(正例)和几个随机采样的噪声词(负例),然后模型能够从这几个词中找到正确的词,就算达到目的了。
那么如何对负例进行采样呢?作者直接使用基于词频的权重分布来获得概率分布进行抽样:
相比于直接使用频次作为权重, 取0.75幂的好处可以减弱不同频次差异过大带来的影响,使得小频次的单词被采样的概率变大。
此时的损失函数为:
Glove []
Questions
Reference Papers
[1] Mikolov, T.(2013). Distributed Representations of Words and Phrases and their Compositionality.
[2] Mikolov, T.(2013). Efficient Estimation of Word Representations in Vector Space.
[3] Rong, X. (2014). word2vec Parameter Learning Explained.
[4] GloVe: Global Vectors for Word Representation
[5] Enriching Word Vectors with Subword Information
[6] Bag of Tricks for Efficient Text Classification
词向量与语言模型
1. 语言模型基础与词向量
语言模型可以简单理解为一个句子 s 在所有句子中出现的概率分布 P(s)。比如一个语料库中有100 个句子,『OK』这个句子出现了5次, 那么
那么,如何学习到这种概率分布呢? 最简单的方法是建立一个无比庞大的语料库,该语料库中包含了人类成百上千年间可能讲过的所有的话,那么我们不就可以算出这句话出现的概率了吗。可惜此方法不现实。
那么,能不能通过数学的方法进行表示呢?答案是可以滴,因为 S 是一个序列
那么现在的问题就变成了我们如何计算
统计方法 - n元模型
回忆概率论:
我们观察上式,会发现,
**马尔可夫假设:**假设任意一个词
缺陷:
- 无法建模更远的关系,语料的不足使得无法训练更高阶的语言模型。
- 无法建模出词之间的相似度。
- 训练语料里面有些 n 元组没有出现过,其对应的条件概率就是 0,导致计算一整句话的概率为 0。解决这个问题有两种常用方法: 平滑法和回退法。
深度学习方法 - 神经网络语言模型[1]
首先,我们回到问题本身,我们为什么要计算

观察上图,假设有一组词序列:
表示这个词序列中的第 个单词, 表示输入长度为n的词序列中的第一个单词 表示从第1个单词到第 个单词组成的子序列
因此我们发现,该模型的每个样本其实计算的是:
词向量 - 表示语言的方式
前面我们通过 NNLM 可以知道,通过语言模型的训练,模型可以学习到语言的概率分布,那么如何将学习到的信息应用到下游任务呢? 这就是词向量产生的背景,如何用向量来表示语言信息,这里我们简单介绍下 Word2vec[4]。
首先明确一点的是, 词向量是语言模型的副产物。 怎么理解呢,意思是说,词向量是语言模型训练完成后产生的。
这里我们以word2vec 的 CBOW 训练模型为例:

通过这样训练完成后,把
2. 预训练语言模型 - 用模型表示语言
前面提到,我们的最终目的还是通过语言模型来获得某种语言的表示,但是我们看到,上面那种训练方式,似乎不太合适,那个最后
我们此处总结一下word2vec的弱点:
- 模型无法做深,词向量的表征能力有限,词向量的抽象程度不高
- 词向量获得的是上下文无关的,难以解决歧义问题上
- OV 词无法解决
很有意思的是, 相差几个月的时间, ELMO ,GPT, BERT 相继诞生了,都非常具有代表性。 下面会进行分别介绍。
0. NLP 特点
在进入预训练语言模型之前,我们先来看看对于NLP来说,最重要的是什么。
首先是 NLP 的特点:
输入是一个一维线性序列
输入是不定长的,这点对于模型处理起来会比较麻烦
单词位置与句子位置的相对位置很重要,互换可能导致完全不同的意思
句子中的长距离特征对于理解语义也非常关键。
其次是,NLP 中的几大常见的任务:
- 序列****标注: 分词,词性标注,命名实体识别等。 特点是句子中每个单词要求模型根据上下文都要给出一个分类类别
- 分类任务: 文本分类, 情感分析。 特点是不管文章有多长,总体给出一个分类类别即可。
- 句子关系推断: QA, 自然语言推理。 特点是给定两个句子,模型判断出两个句子是否具备某种语义关系。
- **生成式任务:**机器翻译, 文本摘要。特点是输入文本内容后,需要自主生成另外一段文字。
最后,我们来聊聊三大基本单元: CNN,LSTM,Transformer。
首先先看简单回顾下 Transformer的self-attention 机制,该机制在预训练语言模型中起到了至关重要的作用。我们看到,对于 Transformer 来说,通过self-attention 机制,词与词之间的关系一目了然,并且不会受到文本长度的限制。 然后注意,在 Attention is all you need 这篇文章中,Transformer 是 Encoder-decoder 架构的,这与后面BERT 所用的有所不同,后面BERT 所用的只是 transformer_block。
于是我们总结一下这三个基本单元的优缺点:
RNN:
- 优点:天生的具有时序结构,十分适合解决NLP问题
- 缺点:
- 反向传播时所存在的优化困难问题, 即梯度消失,梯度爆炸问题,进而导致对超长距离依赖的解决不佳
- 并行能力,进而导致难以做深
CNN:
- 优点:
- 可以并行,可以做的非常深
- 能够很好的捕捉 n-gram 特征
- 缺点:
- 无法解决长距离依赖问题
- 对于位置信息不敏感
Transformer:
- 优点:
- self-attention 天生的就解决了长距离依赖问题
- 可以并行,可以做的非常深
- 位置信息通过 position embedding 很好的补充了
- 缺点:
- 对于超长文本,会导致非常大的计算复杂度
- 位置信息依赖于 position embedding
1. ELMO

elmo 是通过 L 层的双向LSTM语言模型来学习上下文信息的,这就解决了上文提到的前两个问题,而针对 OV词, ELMO 采用了 char-level 来生成词向量进而进行训练。而对于ELMO 的不同层而言,不同层的 LSTM 能够把握不同粒度和层级的信息,比如浅层的 LSTM 把握的是单词特征, 中层的 LSTM 把握 句法 特征,深层的 LSTM 把握语义特征。
但, ELMO 的缺点也十分明显:
- LSTM 特征抽取能力远弱于 Transformer , 并行性差
- 拼接方式双向融合特征融合能力偏弱
- 层数浅,只有2层
2. BERT
语言模型:
我们先来看模型架构, BERT-base 采用12 层的 Transformer,这里简单提一下,BERT 的架构相当于 Transformer 的Encoder-decoder 架构中的Encoder。
再然后,我们看下,输入的组成部分,输入包含三个部分,分别是
- token embedding:词向量,第一个单词是CLS标志,可以用于之后的分类任务
- Segment Embeddings:区别两种句子,因为预训练不光做LM还要做以两个句子为输入的分类任务
- Position Embeddings:和之前文章中的Transformer不一样,不是三角函数而是学习出来的
最后,我们看下预训练训练任务部分。
首先是 Masked LM:随机遮蔽输入 token 的15%,然后预测被遮住的 token。这样会带来一个问题,即训练与微调阶段的不一致性,因为训练阶段采用了 [MASK] 而 fine-tune 阶段并没有。为了减轻该问题, we do not always replace “masked” words with the actual [MASK] token. 具体做法如下:
假如我们有一句话, my dog is hairy , 被选中的词为hairy,数据生成器并不总是将hairy替换为[MASK],此时的过程如下:
- 80% 情况下: 用[MASK] 替换 hairy
- 10% 情况下: 随机选一个词如apple 来替换hairy
- 10%: 不改变这句话
然后是 NSP,即Next Sentence Prediction,选定一个句子A,B作为预训练样本,B有50%的可能是A的下一句,也有50%的可能是语料库的随机句子。
2. GPT 1.0
其实GPT 1.0 要比 BERT 出来的早,但是吃了不会宣传的亏啊。首先来看语言模型:
跟bert 有很明显的差别,但是符合原来语言模型的的定义。
其次, 模型结构采用单向Transformer, 这是由于语言模型决定的。
第三个是, embedding 不包含 NSP 这种 segment embedding。
说到这里,我们就说完了基础的三个预训练语言模型,接下来我们探讨下如何更好的使用预训练语言模型。
3. 如何使用预训练语言模型
1. 是否要进行微调[1]
我们是直接采用训练好的向量还是用预训练语言模型进行微调呢?
『冰』表示freeze, 『火』表示微调的结果。
实际上,对于大多数的任务, BERT 进行微调的方式总是比提取向量再训练的方式能够获得更佳的效果。因此,在条件允许的情况下,推荐采用微调的方式。
2. 是否要进行再次预训练[2]
答案是需要。
我们知道现在的预训练语料采用的都是百科,书籍等比较规范的数据,而实际业务中的数据千差万别,可以这么理解,预训练本身获得的是语料库中文本的分布,而如果预训练数据分布与业务数据分布偏差较大,会带来一些负面影响。
因此,针对一些业务,如果数据与百科数据差别非常大,先进行预训练,然后再进行微调是一种比较合适的方式。
我们这里简单介绍下[2] 中的结论
- 在目标领域的数据集上继续预训练(DAPT)可以提升效果;目标领域与语言模型的原始预训练语料越不相关,DAPT效果则提升更明显。
- 在具体任务的数据集上继续预训练(TAPT)可以十分“廉价”地提升效果。
- 结合二者(先进行DAPT,再进行TAPT)可以进一步提升效果。
- 如果能获取更多的、任务相关的无标注数据继续预训练(Curated-TAPT),效果则最佳。
3. BERT 向量 vs Glove 向量
接下来我们分析下 , BERT 相对于 Glove 向量,到底强在哪里。 首先是训练数据规模的影响,
- 随着数据规模的扩大,Glove 向量的表现与 BERT 向量的表现差距越来越小,我们看到当训练数据足够多的时候,Glove 在一些任务上能够获得略差于BERT的影响,但是在绝大多数情况下依旧比BERT 向量差很多,这说明 BERT 对于小数据集的优越性。
- 在简单任务上,随着数据量的增加, Glove 能达到 BERT 十分接近的效果
然后是语言特征:
- **the complexity of text structure:**句子结构的复杂性
- Ambiguity in word usage: 单词的歧义性。
- Prevalence of unseen words:未登录词出现的概率
上图我们可以得出以 BERT 为代表的 Contextual embeddings 在解决一些文本结构复杂度高和单词歧义性方面有显著的效果。
4. 预训练语言模型 - 后时代

首先,我们来分析一下这张图,从上往下:
- Contextual: 谈论 静态 embedding 与 上下文 embedding,被做烂了,pass。
- Architectures: 模型整体架构,这部分还有的探讨,可以参见上面 T5 的Model Architecture 部分。 目前业界还没有统一的标准说应该选择哪种架构,不过从 T5 的效果来看, Transformer+Encoder+Decoder 的效果是最好的,但参数量也上去了。其实就目前来看,研究的意义不是很大了,除非说能出现一个大的突破。
- Task Types: 谈论了两件事: 语言模型的选择以及Contrastive Learning,其实这两个应该分开讨论。
- Multi-Lingual: 从多国语言的角度出发,这方面不太懂,也不感兴趣,觉得用处不会太大。
- Multi-Modal: 多模角度,我个人认为这对于工业界是十分有意义的。
- Knowledge Enriched: 知识 + 预训练语言模型,我觉得这是一个很值得研究的方向,无论是在工业界和学术界。
- Domain Specific: 特定领域 + 预训练语言模型,我觉得这方面很有搞头,毕竟很多专有领域跟公共领域还是很不同的,比如医学,生物,法学等。由于每看过相关文章,无法说上面的模型与 bert在同样语料上预训练后哪个效果好,但还是有一定参考价值的。
- Language-Specific: 这块我觉得还是很有研究价值的,毕竟我们中文跟英文从各个方面来说差距还是蛮大的,如果能对语言有深入了解,感觉还有搞头。
- Model Compression: 模型压缩,这个在工业界用处很大,十分建议研究,需求也很大,一些蒸馏方法所需要的资源门槛也比较低,如果有资源,有idea,建议入坑。
考虑到涉及到的内容太多,我这里抽取四个部分讨论,分别是: Architectures, Task Types, Knowledge Enriched 以及 language generation。
1. AE vs AR
AR 语言模型:自回归语言模型,指的是,依据前面(或后面)出现的 tokens 来预测当前时刻的 token, 代表有 ELMO, GPT 等。
AE 语言模型:通过上下文信息来预测被 mask 的 token, 代表有 BERT , Word2Vec(CBOW) 。
AR 语言模型:
- **缺点:**它只能利用单向语义而不能同时利用上下文信息。 ELMO 通过双向都做AR 模型,然后进行拼接,但从结果来看,效果并不是太好。
- 优点: 对生成模型友好,天然符合生成式任务的生成过程。这也是为什么 GPT 能够编故事的原因。
AE 语言模型:
- 缺点: 由于训练中采用了 [MASK] 标记,导致预训练与微调阶段不一致的问题。 此外对于生成式问题, AE 模型也显得捉襟见肘,这也是目前 BERT 为数不多实现大的突破的领域。
- 优点: 能够很好的编码上下文语义信息, 在自然语言理解相关的下游任务上表现突出。
2. GPT 系列
1. GPT 2.0
GPT 2.0 验证了数据的重要性,即使单纯的从数据角度入手,效果就可以获得巨大的提升。GPT 2.0 采用800w 互联网网页数据,这样训练出来的语言模型,能够覆盖几乎所有领域的内容。
第二个意义在于,GPT 2.0 开始探索了预训练语言模型在 zero-shot 下的表现。这方面在GPT 3.0 中体现的淋漓尽致。
- 预训练数据与网络深度的重要性,目前也没有到极限。
- GPT 2.0 的生成效果非常惊艳,至少语法,流畅度等方面是没有问题的,就是没有灵魂
- zero-flot 也不是不可以
2.0 GPT 3.0
先来介绍一下几个概念:
- FT,fine-tuning:就是微调啦
- FS,few-shot:允许输入数条范例和一则任务说明
- One-shot:只允许输入一条范例和一则任务说明
- Zero-shot:不允许输入任何范例,只允许输入一则任务说明
GPT 3.0 本质上是探索超大型预训练语言模型在 few-shot,one-shot,zero-shot 上的可能性,这是延续之前 GPT 2.0 的研究,整体上,GPT 3.0 在 zero-shot 下能获得相当不错的结果。
3. BERT 系列
1. Roberta
roberta 是bert 的一个完善版,相对于模型架构之类的都没有改变,改变的只是三个方面:
预训练数据:
- BERT采用了BOOKCORPUS 和英文维基百科, 总共16GB。而 RoBERTa采用了BOOKCORPUS + 英文维基百科+ CC-NEWS+OPENWEBTEXT+STORIES, 总共160GB。
- Roberta 于bert 都采用 512 个token 作为序列长度,但与bert不同的是, robert 不会随机掺杂一些短句,这意味着 roberta 采用的都是长句。
动态mask vs 静态 mask:
- **静态mask:**Bert 在准备训练数据时,每个样本只会进行一次随机mask,每个epoch都重复使用,后续的每个训练步都采用相同的mask。
- 修改版静态mask: 在预处理时将数据集拷贝10次,每份数据采用不同的mask。
- 动态mask:不在预处理时进行mask,而是在每次向模型输入时动态生成mask
数据格式与NSP:
- **Segment-pair + NSP:**与bert一样。输入包含两个 segment,这两个segment可能会来自同一个文档或不同文档,两个segment 的token 数均小于 512,预训练任务包含 MLM 与 NSP。
- **Sentence+pair + NSP:**输入包含两个 sentence,两个句子可能来自同一文档或不同文档,两个句子 token 数均少于 512。预训练任务包含 MLM 与 NSP。
- **Full-sentences:**输入只有一部分,来自同一个文档或不同文档的连续句子,token总数不超过512。输入可能跨越文档边界,如果跨文档,则在上一个文档末尾添加文档边界token。不包含NSP任务。
- **Doc-sentences:**输入只有一部分,输入来自同一个文档的连续句子,token总数不超过512。预训练不包含 NSP 任务。
通过四个对比实验我们发现:
- Segment-pair 较好于 sentence-pair,可能是因为 segment 能够学习到长距离依赖关系。
- Doc-sentences 几乎在所有任务中表现最佳,这意味着 NSP 任务没有什么用
- Doc-sentences 略好于 Full-sentences。
2. T5
4. 预训练语言模型与自然语言生成
这里我们先来回顾一下BERT和GPT, 前面提到, BERT 本质上相当于 Transformer 中的 Encoder, 而GPT 相当于 Transformer 中的 Decoder。既然我们已经验证了 Transformer 在文本生成领域的成功,尤其是机器翻译领域, 那么当我们想用于生成问题的时候,很自然的想到有没有办法把二者结合起来呢?
MASS 就是基于这样的思想。
1. MASS
MASS 的思想很简单, 对于输入序列 x, mask 该句从 u 到 v 位置上的token,记为
为何 MASS 适合生成
首先, 通过 Seq2Seq 框架来预测被 mask 的tokens 使得 Encoder 去学习没有被 mask 的 token 的信息, 而Decoder 去学习如何从 Encoder 中提取有效的信息。
然后, 与预测离散的 tokens相比,Decoder 通过预测连续的 tokens, 其能够建立很好的语言生成能力。
最后, 通过输入与输出的 mask 匹配, 使得 Decoder 能够从Encoder 中提取到有意义的信息,而不是利用之前的信息。
MASS 总结来说有以下几点重新:
- 引入了 Seq2Seq 来训练预训练模型。
- mask 掉的是一段连续的tokens而不是离散的 mask, 有助于模型生成语言的能力。
- Encoder 中是 mask 掉的序列,而 Decoder 中是对应被mask的 tokens。
2. UNILM
UNILM 同样想融合bert与gpt ,然而走了与 MASS 完全不同的路子,它想通过多任务学习的方式来解决。UNILM 这篇文章,厉害在同时使用多个预训练语言模型训练这个思想,在预训练任务中包含了三种语言模型:
Bidirectional LM : BERT 的 mask LM
Unidirectional LM:GPT 的 语言模型,包括 left-to-right 到 right-to-left
Seq2Seq LM: 句子间LM。输入两个句子,第一个句子采用双向LM方式,第二个采用单向LM 方式。
3. BART
BART 与 MASS 的基本思想一致,都是受到 Transformer 在机器翻译领域的成功,尝试将 Transformer架构跟预训练结合起来。
但是与 MASS 不同的是,他们输入的数据格式有很大的差别,Decoder 也有较大的差别。与MASS 相比, BART 完全延续 Transformer 原来的架构方式。
训练数据:
- Token Masking 和BERT一样,随机选择token用[MASK] 代替。
- Token Deletion 随机删除token,模型必须确定哪些位置缺少输入。
- Text Filling 屏蔽一个文段,文段长度服从泊松分布(λ=3)。每个文段被**一个[MASK]**标记替换。如果文段长度为0,意味插入一个[MASK]标记(灵感来自Span-BERT)。
- Sentence Permutation 以句号作为分割符,将一篇文章分成多个句子,并随机打乱。
- Document Rotation 随机均匀地选择一个token,以这个token为中心,旋转文档,选中的这个token作为新的开头,此任务训练模型以识别文档的开头。
5. 预训练语言模型融入知识
1. ERNIE
ERINE 的网络架构,语言模型等与 BERT 完全相同,与BERT 不同的主要有两点:
- 数据的mask
- NSP 任务 与 DLM
首先我们来看 mask 方式,ERNIE 的 mask 包括三部分:
BERT 的 basic-level mask 预训练
Phrase-level 预训练
Entity-level 预训练
但是我们反过来看这篇文章,它融入知识了吗? 我觉得没有,对于知识图谱来说,实体本身的含义很重要,但是实体的关系同样非常重要,而这篇文章并没有融入任何的关系信息。
2. ERNIE (清华)
这篇文章最核心的点在于,将BERT的信息与TransE 的信息进行融合
我们看到,上述整个模型可以整体分为两部分:
- T-Encoder: 与 Bert 的预训练过程完全相同,是一个多层的双向 Transformer encoder, 用来捕捉词汇和语法信息。
- K-Encoder: 本文创新点,描述如何将知识图谱融入到预训练模型。
3. K-BERT
Reference
语言模型基础与词向量:
[1] A Neural Probabilistic Language Model
[2] Mikolov, T.(2013). Distributed Representations of Words and Phrases and their Compositionality.
[3] Mikolov, T.(2013). Efficient Estimation of Word Representations in Vector Space.
[4] Rong, X. (2014). word2vec Parameter Learning Explained.
预训练语言模型:
[1] ELMO: Deep contextualized word representations
[2] BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
[3] GPT 1.0: Improving Language Understanding by Generative Pre-Training
[4] GPT 2.0: Language Models are Unsupervised Multitask Learners
[5] GPT 3.0: Language Models are Few-Shot Learners
应用预训练语言模型:
[1] To tune or not to tune? adapting pretrained representations to diverse tasks.
[2] Don’t Stop Pretraining: Adapt Language Models to Domains and Tasks
预训练语言模型 - 后时代:
[2] ERNIE - Enhanced Language Representation with Informative Entities
[3] ERNIE - Enhanced Representation through Knowledge Integration
[4] ERNIE 2.0 - A Continual Pre-training Framework for Language Understanding
[5] MASS - Masked Sequence to Sequence Pre-training for Language Generation
[6] UNILM - Unified Language Model Pre-training for Natural Language Understanding and Generation
[7] XLNet - Generalized Autoregressive Pretraining for Language Understanding
[8] RoBERTa - A Robustly Optimized BERT Pretraining Approach
[9] TransformerXL: Attentive Language Models Beyond a Fixed-Length Context
如何预训练一个好的预训练语言模型:
[1] Pre-trained Models for Natural Language Processing: A Survey
[2] T5: Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer
1 | Bag of Tricks for Efficient Text Classification |
语言模型与词向量基础
1. 语言模型基础与词向量
语言模型可以简单理解为一个句子 s 在所有句子中出现的概率分布 P(s)。比如一个语料库中有100 个句子,『OK』这个句子出现了5次, 那么
那么,如何学习到这种概率分布呢? 最简单的方法是建立一个无比庞大的语料库,该语料库中包含了人类成百上千年间可能讲过的所有的话,那么我们不就可以算出这句话出现的概率了吗。可惜此方法不现实。
那么,能不能通过数学的方法进行表示呢?答案是可以滴,因为 S 是一个序列
那么现在的问题就变成了我们如何计算
2. 统计方法 - n元模型
我们观察上式,会发现,
马尔可夫假设:假设任意一个词
缺陷:
- 无法建模更远的关系,语料的不足使得无法训练更高阶的语言模型。
- 无法建模出词之间的相似度。
- 训练语料里面有些 n 元组没有出现过,其对应的条件概率就是 0,导致计算一整句话的概率为 0。解决这个问题有两种常用方法: 平滑法和回退法。
3. 深度学习方法 - 神经网络语言模型[1]
首先,我们回到问题本身,我们为什么要计算

观察上图,假设有一组词序列:
表示这个词序列中的第 个单词, 表示输入长度为n的词序列中的第一个单词 表示从第1个单词到第 个单词组成的子序列
因此我们发现,该模型的每个样本其实计算的是:
Attention机制
Attention 机制 – 基础篇
Hard vs Soft [1]
Attention首先分为两大类:Hard Attention 与 Soft Attention, 两者的区别在于 Hard Attention 关注一个很小的区域,而soft Attention 关注的相对要发散。 举个机器翻译方面的例子:
我是小明 –> I am XiaoMing
- 对于 Hard Attention而言,在第1时刻翻译时,只关注“我”这个词,我们翻译得到“I”,在第2时刻翻译时,关注“是”这个词,翻译结果为“am”,以此直到 t 时刻结束。 它是采用one-hot编码的方式对位置进行标记,比如第1时刻,编号信息就是[1,0,0…], 第二时刻,编码信息就是 [0, 1, 0, …], 以此类推。这样会带来一个缺点:无法采用常规优化方法来进行优化,具体的训练细节很复杂,不推荐深入了解。
- 而对于soft attention 而言,在第一时刻翻译时, “我是小明” 都对 “I” 做出了贡献,只不过贡献有大小之分,也就是说,虽然“我”这个词很重要,但是我们也不能放过其他词所带来的信息。
比较二者而言,很显然,soft attention有很大的优势,因此,对于NLP领域而言,目前大多数的研究都基于 soft Attention 进行扩展。
虽然 [1] 具有很强的开创意义,但其毕竟是关于CV领域的,不推荐精读,因此我没有写任何公式,个人十分推荐下面这篇文章来作为 Attention 的第一篇精读论文。
Global vs Local [2]
在 soft attention阵营中,很快又划分为两大阵营: Glocal attention 与 Local attention, 二者的区别在于关注的范围大小不同, 其中,Global attention 关注全部的文字序列,而 Local attention 关注的是固定的窗口中的所有文字序列。
比较二者, Global attention 的计算量要比 Local Attention 要大,尤其是对于长句子而言,效率变得很低; 而 Local Attention 只与窗口内的文字相关,因此窗口的大小就显得至关重要了,且在local attention 中多了一个预测中心词
另一方面,由于Global Attention考虑的信息较多,因此从原理上讲要更好一些,毕竟local attention 可能会忽略对当前输出很重要的词,且 Local Attention 的表现与窗口的大小密切相关,如果设置小了,可能会导致效果变得很差。
而考虑到NLP中问题的复杂性(如句子长短不一,句子之间可能有很强的相关性),因此后来的很多论文[3][4]中很少考虑采用 Local Attention 方法,且我自己在做阅读理解任务时,也基本不会考虑Local Attention, 毕竟窗口大小的设置实在太考验人了。
- Global Attention

- local attention

Attention的本质思想 [5] [6]

在上图中,Query 表示我们的问题信息,在阅读理解问题中,其对应的就是 question,而在机器翻译中,常常采用上一时刻的输出信息
对于 { key:value }而言,大多数情况下key与value是相同的,一般指的是第 j 个词的表示, 比如在机器翻译中, key 与 value 通常采用词的隐层输出
由上式可以看到,对于Attention机制的整个计算过程,可以总结为以下三个过程:
- socre 函数: 根据 Query 与 Key 计算两者之间的相似性或相关性, 即 socre 的计算。
- **注意力权重计算:**通过一个softmax来对值进行归一化处理获得注意力权重值, 即
的计算。 - **加权求和生成注意力值:**通过注意力权重值对value进行加权求和, 即
的计算。
总的来说,Attention 无论如何变化,总是万变不离其宗。 对于大多数 Attention 的文章来说,其变化主要在于 Query, Key, Value 的定义以及第一阶段 Score 的计算方法,下面我们来详细讨论一下。
Score 函数的选择 [6] [2]
Score 函数本质的思想就是度量两个向量的相似度。
常见的方式主要有以下三种:
- 求点积:学习快,适合向量再同一空间中,如 Transformer 。
- Cosine 相似性
- MLP网络
一般情况下,采用MLP网络更加灵活一些,且可以适当的扩展层以及改变网络结构,这对于一些任务来说是很有帮助的。
Query, Key, Value 的定义
对于一个 Attention 机制而言,定义好 Query, Key, Value 是至关重要的,这一点我个人认为是一个经验工程,看的多了,自然就懂了。 我这里简单举阅读理解与机器翻译的例子:
- 对于机器翻译而言,常见的是: Query 就是上一时刻 Decoder 的输出
, 而Key,Value 是一样的,指的是 Encoder 中每个单词的上下文表示。 - 对于英语高考阅读理解而言, Query 可以是问题的表示,也可以是问题+选项的表示, 而对于Key, Value而言,往往也都是一样的,都指的是文章。而此时Attention的目的就是找出文章中与问题或问题+选项的相关片段,以此来判断我们的问题是否为正确的选项。
由此我们可以看出, Attention 中 Query, Key, Value 的定义都是很灵活的,不同的定义可能产生不一样的化学效果,比如 Self-Attention ,下面我就好好探讨探讨这一牛逼思想。
Self-Attention [5]
Self-Attention 可以说是最火的 Attention 模型了,其在最近很火的 Bert 中也起到了重要的作用,最关键的是,其可与 LSTM 一较高低。
这篇文章是十分值得精读,反复看的,因为其真正的将 Attention 用到了另一个新的高度,膜拜 Google。鉴于篇幅所限,本文就不赘述其中详细原理了,而是简述一下其核心思想。
Self-Attention 的本质就是自己注意自己, 粗暴点来说,就是,Q,K,V是一样的,即:
它的内部含义是对序列本身做 Attention,来获得序列内部的联系,如下图所示 [7]。

这其实是有点类似于我们在 Embedding 层的时候采用 LSTM 来获得输入序列的上下文表示,但与 LSTM 不同之处在于Self - Attention 更能够把握句子中词与词的句法特征或语义特征,但另一方面其对于序列的位置信息不能很好的表示,这也是为什么会采用 Postition Embedding 来对位置信息做一个补充,但对于一些对位置信息敏感的任务,position Embedding 所带来的信息可能会不够。
之所以说这篇文章具有开创意义,是因为其将Attention用到了一个基础单元上, 为取代LSTM提供了一种可能。
Reference
[1] Show, Attend and Tell: Neural Image Caption Generation with Visual Attention – 不推荐
[2] Effective Approaches to Attention-based Neural Machine Translation
[3] Neural Machine Translation by Jointly Learning to Align and Translate
[4] Neural Responding Machine for Short-Text Conversation
[5] Attention is all you need
Refernece
Do People and Neural Networks Pay Attention to the Same Words? Studying Eye-tracking Data for Non-factoid QA Evaluation
1 | https://mp.weixin.qq.com/s?__biz=MzIwNzc2NTk0NQ==&mid=2247513060&idx=1&sn=8d96a41ed097c9c4acf1b3d54af271ba&chksm=970f9b32a0781224fe7a450ed7428b9943839bacdb1874098469a4946234dfd8aea4ed8caf4b&scene=21&cur_album_id=1350016038754385921#wechat_redirect |
推荐先看
此外,代码十分推荐看 Bert-pytorch 里面的实现,代码比上述的要更加清晰,可以看完上述代码与 bert 之后再看。
1. Scaled Dot-product Attention

- 首先, Q 与 K 进行了一个点积操作,这个就是我在 Attention 讲到的score操作;
- 然后经过 Scale 操作,其实就是为了防止结果过大,除以一个尺度标度
, 其中 是 Q 中一个向量的维度; - 再然后, 经过一个Mask操作; 考虑到Q,K都是矩阵,且由于句子的长度是不定的,因此Q,K中必然会有一个补齐的操作,为了避免补齐的数据会影响我们Attention的计算,因此需要将补齐的数据设置为负无穷,这样经过后面的Softmax后就接近于 0,这样就不会对结果产生影响了。
- 最后经过一个 Softmax 层, 然后计算Attention Value。
我们可以看到,这个依旧沿袭的是 Attention 的经典思想,不过在其中添加了一些操作如Scale, Mask,这意味着,对于Attention 而言, 其只要核心思想不变,适当的调整数据能够获得更好的结果。其公式如下:
这里解释一下 Scaled Dot-product Attention 在本文中的应用,也是称为 Self-Attenion 的原因所在,这里的Q,K, V 都是同源的,意思就是说,这里是句子对句子自己进行Attention来查找句子中词之间的关系,这是一件很厉害的事情,回想LSTM是怎么做的,再比较 Self-Attention, 直观的感觉,Self-Attention更能把握住词与词的语义特征,而LSTM对长依赖的句子,往往毫无办法,表征极差,这一点会单独讨论。
2. Muti-head Attention

这里多头的含义其实就是采用多个Attention来从多个维度来把握词的信息,我们从图中看到,这里有 h=8 个Attention,每个Attention输出一种 Self-Attention 的结果,然后 Concat 起来。
- 首先,Q,K, V 进过了一个线性变换,然后再传入到 Scaled Dot-Product Attention 中, 注意一点,对于不同的 Scaled Dot-Product Attention 而言, 变换矩阵是不一样的,且这些变换矩阵都参与训练。
- 然后,将每个 Attention 的输出 Concat。
- 最后,进过一个线性变换输出,这个线性变化矩阵也是可训练的。
3. 残差网络,Normalization与feed-forward network

- 首先,Encoder 与Decoder中都有着很明显的残差连接,这种残差结构能够很好的消除层数加深所带来的信息损失问题。这也是一篇很值得看的文章。
- 其次,有一个Layer Normalization过程,这在神经网络中其实也是很常见的手段,也是很经典的一篇文章。
- 然后,数据经过了一个前馈神经网络, 该前馈神经网络采用了两个线性变换,激活函数为Relu,公式如下:
4. Transformer 中如何使用 Multi-head Attention
Transformer 中使用 Multi-head Attention要注意以下几点:
- 在 Encoder 与 Decoder 中的黑色框中,采用的都是是 Self-Attention ,Q,K,V 同源。
- 需要注意的是只有在 Decoder 中的 Muti-head 中才有 Mask 操作,而在Encoder中却没有,这是因为我们在预测第 t个词时,需要将 t 时刻及以后的词遮住,只对前面的词进行 self-attention,这点不理解的话可以回想一下Sequence-to-Sequence那篇文章中对机器翻译的训练过程 。
- 在黄色框中, Q 来自Decoder层, 而 K, V来自Encoder的输出 。
5. Positional encoding
由于 Self-Attention 自己是把握不到句子的顺序信息的,因此,Transformer 需要采用 Positional encoding 来获取序列的顺序信息,论文中采用了正余弦函数的方式。
本质上的核心思想是: 在偶数位置,使用正弦编码,在奇数位置,使用余弦编码
通过上式,我们可以得出:
6. 最后的 Linear 与 Softmax
这个其实没什么好说的,一般都会在最后一层加一个前馈神经网络来增加泛化能力,最后用一个 softmax 来进行预测。
回归到整体
前面已经将所有的细节都讲的很清楚了,这里回到整体的情况下来简要谈一下论文中的Encoder与Decoder。
- Encoder 是由一个Stack组成, Stack中有6个相同的Layer, 每个Layer的结构如3图中所示
- Decoder 同样由一个Stack组成, Stack中也有6个相同的Layer, 与 Encoder中的Layer有所差别, 主要是多了一个将Encoder输出引入的Muti-Head机制,这点在3图中也能很明白的看出来。
QA
1. Mask 三连问
mask 操作是什么?
mask 操作是对某些值进行掩盖,使得其再参数更新时不产生效果。
它是怎么做的?
通过将需要被mask的位置设置为负无穷,这样在后面的Softmax后,这些位置的概率就接近于 0,这样就不会对结果产生影响了。
为什么要 mask ?
Transformer 本身的 mask 操作分为两部分: padding mask 与 sequence mask。
Padding mask: 考虑到每个批次中输入序列的长度是不一样的,而往往我们要先进行对其,对不足长度的文本进行 padding, 而这些padding 的词其实是没有意义的, 因此我们在做 Self-attention 的时候应该忽略它。
Sequence Mask: 在Decoder 中,其不应该看见未来的信息,即对一个序列,当
time_step=t时, 我们Decoder 的输出应该只依赖于 t 时刻之前的输入,而不应该依赖于 t 时刻之后的输入。具体的做法是,产生一个上三角矩阵,上三角的值全为 1,下三角的值权威0,对角线也是 0。
2. Scaled Dot-product Attention 中的Scaled 是啥,有啥用?
Scaled 就是缩放数据。
- 比较大的输入会使得 softmax 的梯度变得很小,当数量级较大时, softmax 将几乎全部的概率分布都分配给了最大值对应的标签, 此时梯度消失为 0, 参数更新会变得困难。
- 假设 Q, K 的各个分量是相互独立的随机变量,均值为 0, 方差为1,那么点积
的均值为 0, 方差为 。 方差越大,说明点积的数量级越大,通过除以 将方差稳定到 1, 可以有效的控制前面提到的梯度消失问题。
3. 为什么 Position embddding 采用正余弦函数 ?
因为有:
这样使得模型能够记住相对位置信息。
Transformer 的位置编码
QA
1. 相对位置编码和绝对位置编码区别
Reference
文本分类
1. TextCNN[1]

对于一个窗口大小为
1个卷积核对
然后,文章对特征向量
上述的过程描述的是一个卷积核对
对于窗口大小为 3 的卷积核, 我们在一次卷积过后获得一个
同样的道理,窗口为 4 的卷积核所提取的特征为一个
最后我们将这三个向量拼接起来形成一个
2. 对TextCNN 的分析 [3]
文章 [3] 对CNN 用于文本分类时的超参进行分析,这些超参包括: 词向量的选择,Filter 的大小, 卷积核的数量, 激活函数的选择, Pooling 策略, 正则化方法。
Word Embedding
文章比较了三种情况: Word2vec, Glove, Word2vec + Glove, 而实际上,三者的性能相差无几, 具体的依旧要看任务数据集,并没有定论,因此在实际的开发中,分别采用不同的预训练词向量来帮助我们更好的选择。
Filter Size
不同的数据集有其适合的 Filter Size, 文章建议区域大小为 1-10 内进行线性搜索, 但如果数据集中的句子长度较大(100+), 那么可以考虑设置较大的 Filter Size。
不同size的 Filter 进行结合会对结果产生影响,当把与最优 Filter size 相近的Filter 结合时会提升效果,但如果与较远的Filter 结合会损害性能。因此,文章建议最初采用一个 Filter , 调节 size 来找到最优的 Filter size, 然后探索最优Filter size的周围的各种 size 的组合。
卷积核数量
对于不同的数据集而言,卷积核的设置也有所不同,最好不要超过600,超过600可能会导致过拟合, 推荐范围为100-600。同时,卷积核数量增多,训练时间会变长,因此需要对训练效率做一个权衡。
激活函数
尽量多尝试激活函数, 实验表明,Relu, tanh 表现较佳。
Pooling 策略
实验分析得出, 1-max pooling 始终优于其他池化策略,这可能是因为在分类任务中,上下文的位置并不重要,且句子中的 n-granms 信息可能要比整个句子更具预测性。
正则化方法
实验表明,在输出层加上L2正则化并没有改善性能,dropout是有用的,虽然作用不明显,这可能是因为参数量很少,难以过拟合的原因所致。文章建议不要轻易的去掉正则化项,可以将 dropout 设置为一个较小值 (0-0.5),推荐0.5 , 对于L2, 使用一个相对较大的约束。 当我们增加卷积核数量时,可能会导致过拟合,此时就要考虑添加适当的正则项了。
3. TextRNN

以双向LSTM 或GRU来获取句子的信息表征, 以最后一时刻的 h 作为句子特征输入到 softmax 中进行预测, 很简单的模型,就不详细介绍了。
4. TextRCNN [4]
说实话,这篇论文写的真乱,一个很简单的思想,看起来比 Transformer 还复杂,真的是有点醉, 不推荐看原论文,写的真的很冗余。
文章的思想很简单:
- 首先,对于单词
, 获得其词向量表示 - 然后, 采用双向 GRU 来获取每个词的上下文向量表示
- 为了更好的表示词的信息,文章将原始词向量
, 上下文表示 结合起来,形成词的新的向量表示,这里作者采用一个全连接网络来聚合这些信息:
采用最大池化来获取句子的最终表示:
最后,采用一个softmax 来做分类:
5. HAN [5]

问题定义
HAN 主要针对 document-level 的分类, 假定document 中有L个句子:
Word Encoder
对于一个句子
Word Attention
考虑到在每个句子中,各个词对句子信息的贡献不同,因此此处引入一个注意力机制来提取语义信息,更好的获得句子的表示。
Sentence Encoder
一个 document 中有L个句子,我们需要对这L个句子的信息进行整合,但很明显,句子之间的信息是由关联的,因此文章采用双向GRU对句子信息进行综合来获得每个句子新的表示:
Sentence Attention
考虑到在一个document中,各个句子的重要程度并不同,因此采用一个Attention 来对句子信息进行整合最终形成 document 的最终信息:
Document Classification
DPCNN
最后
虽然文本分类是最简单的任务,但其在企业中应用最为广泛,十分适合初学者入门学习。
Reference
[1] TextCNN: Convolutional Neural Networks for Sentence Classification
[3] A Sensitivity Analysis of (and Practitioners’ Guide to) Convolutional Neural Networks for Sentence Classification
[4] Recurrent Convolutional Neural Network for Text Classification
[5] Hierarchical Attention Networks for Document Classification
[n] Large Scale Multi-label Text Classification With Deep Learning
Tricks - 文本分类
Reference
文本分类有哪些论文中很少提及却对性能有重要影响的tricks?
命名实体识别
命名实体识别
前言
这篇文章的目的是对命名实体识别领域进行较为全面的综述,包括数据集,评估指标,传统模型,前沿模型,发展方向,个人思考等几大块,目的是为初学者提供一个较为前沿且易懂的学习文章。本文篇幅较长,请耐心阅读,别放在收藏内吃灰哦。
NER简介
Reference
[1] A Survey on Deep Learning for Named Entity Recognition
[2] CLUENER2020: FINE-GRAINED NAMED ENTITY RECOGNITION DATASET AND BENCHMARK FOR CHINESE – 一个2020年最新的中文命名实体识别数据集
[3] LTP: A New Active Learning Strategy for Bert-CRF Based Named Entity Recognition
[4] Few-Shot Named Entity Recognition: A Comprehensive Study
[5] FLAT- Chinese NER Using Flat-Lattice Transformer
[6] Empirical Analysis of Unlabeled Entity Problem in Named Entity Recognition
[7] Lex-BERT- Enhancing BERT based NER with lexicons
上游任务 - 序列标注
前言
Reference
ICLR2021 中唯一录取的NER论文:NER数据存在漏标怎么办?
文本匹配
上游任务 - 文本相似度
1. 孪生网络[1][2]
1. Siamese Recurrent Architectures[1]
2. Siamese Recurrent Networks [2]
Reference
[1] Siamese Recurrent Architectures for Learning Sentence Similarity
[2] Learning Text Similarity with Siamese Recurrent Networks
https://github.com/nlpyang/BertSum
https://github.com/google-research/bert/issues/164
Using Prior Knowledge to Guide BERT’s Attention in Semantic Textual Matching Tasks -2021
https://zhuanlan.zhihu.com/p/358260721
文本相似度
tags: NLP
500 questions : 18.5.6 如何做语义匹配?
[TOC]
前言
文本匹配算是一个基础性的任务,其可以应用到其他上游任务中如:信息检索,问答系统,对话等,这些上游任务本质上还是文本匹配的机制,只不过关注的核心在于,不同的任务需要不同的匹配机制。
文本匹配简介
0. 问题简介
文本匹配在信息检索,自动问答等任务有着广泛的应用,而随着文本匹配逐渐从传统的文本匹配模型向深度文本匹配模型转移,在不同任务上的应用也有很大的改变。
文本匹配问题可以简述为,一个样本中有两段文本:
在实际开发中,问题往往会抽象成一个排序问题,即给定一段文本
最关键的是,语义匹配详细可以划分为5个子任务,分别是:
- 相似度计算
- 问答匹配
- 对话匹配
- 自然语言推理
- 信息检索中的匹配
- 阅读理解匹配
1. 文本匹配的挑战
- 词语匹配的多元性: 不同词可以表示同一个语义; 同一个词在不同语境下会有不同的语义。
- 短语匹配的结构性:中文中这种词非常常见, 如:“机器学习” 与 “学习机器” 是两个不同的概念
- 文本匹配的层次性:文本是以层次化的方式组织起来的,词语组成短语,短语组成句子,句子形成段落,段落形成篇章,在设计模型时,如何考虑不同层次的匹配信息是十分重要的。
2. 深度学习文本匹配模型[3]
根据特征提取的不同方式,深度学习在文本匹配模型中的应用大致可分为三类:
- 基于单语义文本表达的深度学习模型: 将单个文本表达成一个稠密向量,然后计算两个向量之间的相似度来作为文本的匹配度[1] [2]。
- 基于多语义文本表达的深度学习模型:认为单一粒度的向量来表示一段文本不够精细,需要多语义的简历表达,即分别提取词,短语,句子等不同级别的表达向量,再计算不同粒度向量间的相似度作为文本间的匹配度
- 直接建模匹配模式的深度学习模型:认为匹配问题需要更惊喜的建模匹配的模式,即需要更早的让两段文本进行交互,然后挖掘文本交互后的模式特征,综合得到文本间的匹配度。
单粒度语义文本表达
1. DSSM,2013
2. CSDDM, 2014
ARC-I – 卷积
CNTN – 卷积
LSTM-RNN
2. 多粒度语义文本表达
MultiGranCNN
https://github.com/NTMC-Community/awesome-neural-models-for-semantic-match
https://github.com/sebastianruder/NLP-progress/blob/master/english/semantic_textual_similarity.md
MANM
Reference
[1] Siamese Recurrent Architectures for Learning Sentence Similarity
[2] Learning Text Similarity with Siamese Recurrent Networks
[3] 深度文本匹配综述
[3]
无监督文本匹配
Reference
预训练语言模型
BERT 可解释性
Syntactic knowledge
Open Sesame: Getting inside BERT’s Linguistic Knowledge
Patient Knowledge Distillation for BERT Model Compression.
Linguistic Knowledge and Transferability of Contextual Representations.
Parsing as pretraining.
Are pre-trained language models aware of phrases? simple but strong baselines for grammar induction.
Inducing syntactic trees from BERT representations
Do attention heads in BERT track syntactic dependencies?
What does BERT learn about the structure of language?
A Structural Probe for Finding Syntax in Word Representations.
Emergent linguistic structure in artificial neural networks trained by self-supervision.
BERT is not a knowledge base (yet): Factual knowledge vs. name-based rea- soning in unsupervised qa
IsSuper- vised Syntactic Parsing Beneficial for Language Understanding? An Empirical Investigation.
What BERT is not: Lessons from a new suite of psy- cholinguistic diagnostics for language models
Semantic Knowledge
What BERT is not: Lessons from a new suite of psy- cholinguistic diagnostics for language models
What do you learn from context? Probing for sentence structure in contextualized word representations.
Do NLP Models Know Numbers? Probing Numeracy in Embeddings.
What’s in a Name? Are BERT Named Entity Representations just as Good for any other Name?
BERT Rediscovers the Classical NLP Pipeline.
Investigating Entity Knowledge in BERT with Simple Neural End- To-End Entity Linking
Visualizing and Measuring the Geometry of BERT
BERT Rediscovers the Classical NLP Pipeline
理解BERT每一层都学到了什么
[https://www.zhihu.com/search?type=content&q=bert%20%20%E8%81%9A%E7%B1%BB](https://www.zhihu.com/search?type=content&q=bert 聚类)
Recent Advances in Language Model Fine-tuning
Reference
Universal Language Model Fine-tuning for Text Classification
Pretrained Transformers Improve Out-of-Distribution Robustness
Neural Transfer Learning for Natural Language Processing
An Embarrassingly Simple Approach for Transfer Learning from Pretrained Language Models
Zero-Shot Entity Linking by Reading Entity Descriptions
Unsupervised Domain Adaptation of Contextualized Embeddings for Sequence Labeling
Pretraining Methods for Dialog Context Representation Learning
Don’t Stop Pretraining: Adapt Language Models to Domains and Tasks
一文滤清预训练语言模型发展脉络
前言
预训练语言模型的诞生已经3年多了,其衍生的各个子领域可谓是百花齐放,这篇文章对我这几年看过的预训练语言模型方面的 paper 进行一个梳理,对于每个子领域有遗漏的欢迎大家评论补充。
这篇文章会以月为单位更新,拭目以待。
1. BERT 之前
1.1 从 Word Embedding 到 ELMO
Word Embedding 即词向量的诞生,其在13年就已经引起NLP领域的颠覆性发展,Word2vec 就是其典型代表。
考虑到词向量不能解决词的多义性问题,在 ELMO 之前,我们往往采用双向 LSTM 来减轻这种问题,但这毕竟治标不治本,对于大数据集好说, 深层双向 LSTM 的确能够很好的缓解这种问题,但对于小数据集,往往没啥效果。
为了解决这种多义性问题,ELMO 在训练语言模型时采用双向 LSTM 。 不同层的 LSTM 能够把握不同粒度和层级的信息,比如浅层的 LSTM 把握的是单词特征, 中层的 LSTM 把握 句法 特征, 深层的 LSTM 把握语义特征, 对于不同的任务来说, 不同的特征起到了不同的作用。
举例来说: 文本分类问题为何 ELMO 与 BERT 所起到的作用与 Word2Vec 差距并不明显,这就是因为对于文本分类这类简单问题来说, n-gram 信息起到很大的作用,而这本质就是单词特征; 但对于阅读理解领域, ELMO 与 BERT 就能大幅提高模型效果,这也是因为 语法与语义特征对于阅读理解这种深层次问题是十分重要的。
ELMO 在迁移到下游任务时,会将不同层的特征采用加权求和的方式来获得每个词的最终表示。
事实证明, ELMO 的确解决了多义性问题, 词性也能对应起来了。
但, ELMO 的缺点也十分明显:
- LSTM 特征抽取能力远弱于 Transformer , 并行性差
- 拼接方式双向融合特征融合能力偏弱
1.2 Fine-tuning pretraining: GPT 的诞生
GPT 虽然不是第一个预训练语言模型,但它的出现更具开创意义。其特点很明显:
- 采用单向 Transformer 作为特征抽取器
- 采用二阶段: 预训练 + 微调 来适配下游任务
GPT 1.0 与 GPT 2.0 的出现说明了一下几点:
- 高质量,大规模的预训练数据集是提升性能的根本
- 深层的 Transformer 模型具有更强的表示能力
至少,从目前为止, 业界还没有探索到数据与模型的极限,即仅仅堆数据,加深模型这条路,还没有走完。
2. 预训练新时代:BERT的诞生
GPT 虽然很强,但由于其基于 AR 模型且目前很多排行榜都是基于自然语言理解的,因此, GPT 在这方面无法与 BERT 的表现相抗衡。但 GPT 在生成方面是 BERT 无法比拟的, 就问你BERT: 会编故事吗?
BERT 主要分为两大部分: Masked LM 与 NSP (Next Sentence Prediction)。
BERT 由于其采用 AE 模型,MASK 操作所带来的缺陷依旧存在:
- 预训练与微调阶段不匹配的问题,这点 BERT 提供了一个策略来减轻该问题
- Mask 掉的 token 之间关系被忽略的问题
此外,由于数据量,模型都十分大,如果每次只 mask 一个token,那么整个训练过程将变得极为漫长, 文章采用 mask 15% 的操作,是一个经验性的选择,是对模型训练效果与训练时长做出了一个权衡。
至于 NSP 任务,事实证明其在句子关系上的确起到了一定的作用,对于某些任务的确有帮助,但也有文章指出,其实用处不大,这点后面会详细讨论。
2. BERT 之后
BERT 之后,有诸多改进方案,无论是对语言模型进行改进,融合知识图谱进行改进,多任务学习+预训练语言模型等, 这些文章都具有很大的价值,且质量都很高,本节的目的是对最近的这些模型进行一个全面的总结,帮助人们理清思路。对此,我画了一个直观的优化图,如下图所示:
1. 预训练 + 知识图谱
预训练诞生之后, 在自然语言理解领域的确获得了很大的提升,尤其是在阅读理解领域,完全超过了人类的表现,虽然这并不表示真正的智能,但依旧意味着,NLP 已经逐渐走向成熟。
随之而来的问题十分明显, 如何表示知识, 有没有一种方式能够利用大规模语料+预训练语言模型使得模型能够学习到知识,从而应用到下游任务中。相信这个课题将是接下来一个十分核心的热点, 百度和清华就这方面做出了探讨, 具体可参加: Bert 改进: 如何融入知识
百度的文章中提出通过 mask 掉实体来获取实体的表示, 可以肯定的是,这样是能够更好的表示实体信息,但对于实体关系的把握,我个人觉得存疑,这是因为 mask 操作往往不仅仅 mask 掉一个实体,那么被 mask 掉的实体之间的关系如何把握?
我个人觉得可以设计一个精巧的任务来验证实体之间的关系, 可以通过知识图谱来生成一个语料, 如:
1 | 谢霆锋是张柏芝的__。 |
我们来预测空白处的位置, 判断其是否为 丈夫, 前夫 之类的词, 这点需要根据具体的知识图谱而定。
清华的那篇文章,其先编码实体与实体间关系信息为一个向量, 然后将向量融合如预训练语言模型中进行训练, 而实际的操作更为复杂,俺个人觉得,这条路恐怕不是正确的路,不符合大道至简的原则,且任务太多,反而会引入噪声(个人对知识图谱研究不深,只是直观感觉)。
目前来看,个人觉得百度的路是对的。
2. 预训练 + 自然语言生成
这部分包含两个课题:
- 如何将 BERT 用于生成任务
- 如何设计一个适合于生成任务的语言模型
前面在 AR 与 AE 模型中已经介绍过为何 BERT 不适用于生成任务中, 那么随之而来的问题就是,既然预训练语言模型在自然语言理解中如此成功,那么我们怎么将其迁移到自然语言生成中呢, 这是一个很大的问题,个人觉得还需要1年以上的时间发展才能出现类似 Bert 这样的突破。
我个人前期看了两篇文章,大致提了一下思路:Bert 之后:预训练语言模型与自然语言生成
首先,对于第一个课题: 如何将 BERT 用于生成任务。 从技术上来说, Encoder-Decoder 架构应该是首选的框架了, Encoder 输入原句子,Decoder 生成新句子,那么问题在于,Encoder 与 Decoder 如何表示?
对于 Encoder 端来说,我们只需要将 Bert 直接初始化就行;那么对于Decoder 端呢? 也采用 Bert 初始化吗? 要知道的是, Decoder 可是用来生成的, 如果你的 embedding 信息是通过 AE 模型训练得到的,那么生成效果估计会诡异的一批。 那么现在的问题就变成了, 如何合理的初始化 Decoder 端的 embedding 信息呢?
然后,我们再来谈谈第二个课题:如何设计一个适合于生成任务的语言模型。 目前从我看到的两篇文章中有两个思路:
- MASS 通过 mask 连续的一小段来试图即学习到理解知识,又学习到生成知识, 通过预测一段连续的 tokens 的确有助于提高模型生成方面的能力,但我个人觉得 mask 一小段信息所提升的生成能力十分有限, 且我认为这会影响到模型理解方面的能力。
- UULM 就厉害了, 它涉及了一组语言模型: Unidirectional LM, Masked Bidirectional LM, Seq2Seq LM, 真的是有钱任性, 但这样直接堆语言模型的方式真的好吗? 可以肯定的是, 不同语言模型的结合必然是接下来的一大趋势,但你这样直接堆是不是有点暴力啊,我个人感觉一般。
那么,怎么去设计一个适合于生成任务的语言模型呢? 我个人的想法在之前的博客提到了: 就人类而言, 生成是基于理解的,而非独立的, 在大脑中, 理解与生成是两个区域, 先理解后生成,这才是正确的路。
因此,我个人觉得,接下来的一个思路应该是: 理解的归理解,不断提高预训练语言模型在理解领域的表现, 对于生成,采用 Encoder-Decoder 框架。 在预训练的角度来说, 基于理解层面训练得到的模型, 然后分别初始化 Encoder-Decoder 端, 然后去预训练 Decoder 端的参数, Freeze/not Freeze Encoder 端的参数, 从而得到词在 Encoder 与 Decoder 的不同 Embedding, 然后再生成任务中的 Encoder-Decoder 中分别使用这两种 embedding。
3. 预训练 + 多任务学习
多任务学习就更好玩了,目前主要有两大代表: MT-DNN 与 ERNIE 2.0。
MT-DNN 又叫联合训练,其实就是将预训练语言模型用在多个任务中去接着预训练,从而提高模型泛化。具体来说,训练过程就是把所有数据合并在一起,每个batch只有单一任务的数据,同时会带有一个task-type的标志, 然后shuffle 之后进行训练。
ERNIE 提出一个很好的思路: Continual Learning。 这点很有意思,就像人类做题一样, 它不像 MT-DNN 那样训练,而是这样:
1
task1 --> task1,task2 --> task1, task2, task3
即在训练后续任务时,前面的任务依旧要参与训练,主要是希望在学习后续任务时依旧记得前面任务的学习成果。
我个人觉得 ERNIE 更符合我们人类的训练方式,不过具体的两种学习方式的表现还需要对比一下。
回想我们人类的学习方式,其最初是专题训练,即每个 task 分别训练, 然后再进行总体训练,即所有 task 一起进行训练,然后发现自己的弱点,然后适当加强对某任务的训练,然后又进行总体训练,如此反复, 过程更像是这样:
1 | (task1 or task 2 or task3)--> (task1, task2), (task1, task3), (task2, task3) --> (task1, task2, task3) --> (task1 or task2 or task3) --> ... |
如果要保证训练新任务时不会过分忘记前面训练所得到的成果,似乎各个任务的训练样本比例以及训练时间更加重要。比如你做了一年的阅读理解,突然让你做单向选择,你答的也不会太好。
因此,我个人觉得, 联合训练 + Continual Learning 是一个不错的思路。
4. 改进语言模型
要说起改进语言模型,当首推 XLNet, 毕竟前段时间也是刷了榜的,通过交换 token 位置来解决 mask 所带来的预训练与微调不匹配的问题, 这似乎比 BERT 更加优秀。
但从最近的实验看来,似乎又不是那么回事, XLNet 精巧的语言模型设计有没有超越 BERT, 目前学界还没有一个定论,RoBERTa 的出现似乎验证了在同等数据集下,XLNet 并不占优势, 通过精调模型参数,RoBERTa 获得了十分漂亮的结果。
而 XLNet 对此予以回击,又在同等条件下对比了 XLNet 与 BERT 模型, 又说明了 XLNet 效果的确要超过 BERT,emmm, 俺也不知道该相信哪个,反正我都会试试,哪个好用哪个。
XLNet 网上讲的很多了,我就不细说了。
5. 预训练 + 中文领域
十分推荐: BERT-WWM
对于中文领域,分词还是分字一直是一个问题,那么,到底是选分词,还是分字,这一直是一个大问题。
BERT 无疑选择了分字这条路, ERNIE 通过融入知识,其实带来了部分分词的效果,那么在预训练语言模型中,分词到底有没有用, BERT-WWM 给出了答案。
通过采用 mask 词的方式, 在原有的 BERT-base 模型上接着进行训练, 这其实有种 词 + 字 级别组合的方式, 我在 深度学习时代,分词真的有必要吗 中就有提到 字级别 与 词级别之间的差别, 而预训练语言模型能很好的组织二者,的确是件大喜事。
而事实证明, BERT-WWM 在中文任务上的确有着优势所在,具体就不细说了,至少目前来说,我们的中文预训练语言模型有三大选择了: BERT , ERNIE, BERT-WWM。
6. 预训练 + 精细调参
通过精细调参, BERT 能够发挥出更大的威力。 RoBERTa 证明了这一点。
此外, RoBERTa 认为 NSP 不仅不能带来下游任务的性能提升,反而会有所损害。 RoBERTa 的出现说明 BERT 本身的还有很多潜力要挖。
总的来说,这篇文章依旧是个苦工活,虽创新度一般,但价值很高。
7. 预训练+ 基础单元
大多数语言模型都采用 Transformer 来作为预训练的基本单元,那么 Transformer 有没有改进的空间呢? 必然是有的。
XLNet 采用 Transformerxl 作为基本单元来解决长文本问题,Transformerxl 本质上就是 Transformer + 循环机制, 这样会带来并行性上的损失。
相信后续还会有更多的变体来解决 Transformer 的各种问题, 如果有对 Transformer 研究十分深的同学欢迎补充一下。
最后
本来打算再多研读几篇文章再写的,但是限于精力原因(忙于秋招),只能对前段时间看的论文大致总结, 提一些自己的思路,实在是无力去找新的 Paper 了。
希望9月初会下 offer 雨打我的脸啊!!!
Reference
[1] BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
[2] ERNIE - Enhanced Language Representation with Informative Entities
[3] ERNIE - Enhanced Representation through Knowledge Integration
[4] ERNIE 2.0 - A Continual Pre-training Framework for Language Understanding
[5] MASS - Masked Sequence to Sequence Pre-training for Language Generation
[6] RoBERTa - A Robustly Optimized BERT Pretraining Approach
[7] UNILM - Unified Language Model Pre-training for Natural Language Understanding and Generation
[8] XLNet - Generalized Autoregressive Pretraining for Language Understanding
1. AR 与 AE 语言模型
AR:Autoregressive Language Modeling
AE: Autoencoding Language Modeling
AR 语言模型:指的是,依据前面(或后面)出现的 tokens 来预测当前时刻的 token, 代表有 ELMO, GPT 等
AE 语言模型:通过上下文信息来预测被 mask 的 token, 代表有 BERT , Word2Vec(CBOW)
二者有着它们各自的优缺点:
AR 语言模型:
- **缺点:**它只能利用单向语义而不能同时利用上下文信息。 ELMO 通过双向都做AR 模型,然后进行拼接,但从结果来看,效果并不是太好。
- 优点: 对生成模型友好,天然符合生成式任务的生成过程。这也是为什么 GPT 能够编故事的原因。
AE 语言模型:
- 缺点: 由于训练中采用了 [MASK] 标记,导致预训练与微调阶段不一致的问题。 此外对于生成式问题, AE 模型也显得捉襟见肘,这也是目前 BERT 为数不多实现大的突破的领域。
- 优点: 能够很好的编码上下文语义信息, 在自然语言理解相关的下游任务上表现突出。
BERT 诞生之前
NNLM, Word2vec, ELMO, GPT 1.0
GPT 系列
BERT 系列
spanBERT, Robert
多任务学习
MT-DNN
中文领域
bert-wwm
融入知识
ERNIE 系列, ERNIE-THU, LIBERT, SenseBERT, KnowBERT, BERT-MK,K-BERT,BERT-WWM,WKLM,LUKE,SemBERT,sentiLR,SKEP,KG-BERT,KEPLER
多语言
mBERT, XLM, Unicoder,XLM-R
模型压缩
ALBERT, MiniLM, DistilBERT, TinyBERT, BERT-PKD, Distilled-BiLSTM
文本生成
MASS, UNILM,bart
T5, XLNET, TransformerXL
如何使用预训练模型
0. 基础概念
**预训练:**指的是大公司通过大规模数据,大型网络所训练得出的模型,模型参数量往往很大
训练: 指的是在预训练语言模型的基础上,再添加一些语料,接着训练语言模型,这对硬件的要求也很高,一般实验室玩不起。
**微调:**指的是,不针对语言模型,而是针对特定任务,对上层模型与预训练语言模型进行微调,其实本质上还是对上层模型进行微调,对预训练语言模型进行微调在数据量较小的情况下所起到的作用不大。
1. 是否要进行微调[1]
我们是直接采用训练好的向量还是用预训练语言模型进行微调呢?

『冰』表示freeze, 『火』表示微调的结果。
实际上,对于大多数的任务, BERT 进行微调的方式总是比提取向量再训练的方式能够获得更佳的效果。因此,在条件允许的情况下,推荐采用微调的方式。
2. 是否要进行再次预训练[2]
答案是需要。
我们知道现在的预训练语料采用的都是百科,书籍等比较规范的数据,而实际业务中的数据千差万别,可以这么理解,预训练本身获得的是语料库中文本的分布,而如果预训练数据分布与业务数据分布偏差较大,会带来一些负面影响。
因此,针对一些业务,如果数据与百科数据(预训练)差别非常大,先进行预训练,然后再进行微调是一种比较合适的方式。

我们这里简单介绍下[2] 中的结论:
- 在目标领域的数据集上继续预训练(DAPT)可以提升效果;目标领域与语言模型的原始预训练语料越不相关,DAPT效果则提升更明显。
- 在具体任务的数据集上继续预训练(TAPT)可以十分“廉价”地提升效果。
- 结合二者(先进行DAPT,再进行TAPT)可以进一步提升效果。
- 如果能获取更多的、任务相关的无标注数据继续预训练(Curated-TAPT),效果则最佳。
3. BERT 向量 vs Glove 向量
这篇文章对比了 BERT ,Glove,random 三种向量, 我们都知道, BERT 相对于其他两种向量,其效果提升非常明显,本文基于此,探讨与传统词向量相比,BERT向量优异在何处呢?
为了对比不同词向量的在下游任务的表现,本文采用了三个任务:
- NER: 词汇级别的任务
- sentiment analysis:句子级别的任务
- GLUE:句子对级别的任务
为了更加纯粹对比三种向量,三种词向量在训练时均不微调,如果微调的话,就会难以判断是模型的作用还是词向量本身的作用。
1. 数据规模
实验表明,下游任务的训练数据对于不同的向量影响是十分不同的, 结果如下图所示:


从上图中我们可以看出
随着数据规模的扩大,Glove 向量的表现与 BERT 向量的表现差距越来越小,我们看到当训练数据足够多的时候,Glove 在一些任务上能够获得略差于BERT的影响,但是在绝大多数情况下依旧比BERT 向量差很多,这说明 BERT 对于小数据集的优越性。
在简单任务上,随着数据量的增加, Glove 能达到 BERT 十分接近的效果
2. 语言特性
接下来, 文章从三个角度来评测不同的向量:
- **the complexity of text structure:**句子结构的复杂性
- Ambiguity in word usage: 单词的歧义性。
- Prevalence of unseen words:未登录词出现的概率

从结果来看,以 BERT 为代表的 Contextual embeddings 在解决一些文本结构复杂度高和单词歧义性方面有显著的效果,但是在未登录词方面 GloVe 代表的Non-Contextual embeddings 有不错的效果。
从上面的结论可以看出,
- 在对于拥有大量训练数据和简单任务中,考虑算力和设备等,GloVe 代表的 Non-Contextual embeddings 是个不错的选择。
- 但是对于文本复杂度高和单词语义歧义比较大的任务,BERT代表的 Contextual embeddings 却有明显的优势。
Reference
[1] Don’t Stop Pretraining: Adapt Language Models to Domains and Tasks
[2] To tune or not to tune? adapting pretrained representations to diverse tasks.
[3] Contextual Embeddings: When Are They Worth It?
阅读理解
# 上游任务 -- 信息检索https://www.msra.cn/zh-cn/news/features/ming-zhou-nlp-search-engine
上游任务 - 阅读理解
[TOC]
1. Attentive Reader [1]

Attentive Reader 就有点常规模型的样子了。
首先,采用双向LSTM分别对 passage 与 query 进行 Embedding 来获得上下文表示;
其中,对于 passage 而言,其获得的是一个矩阵 y,矩阵的每一列是 passage 中词的上下文表示;
对于 query, 其将整个信息压缩为一个向量 u。
其次是注意力机制的使用,这里的 Q 为 passage的表示 y, Key 为 query的表示 u, 这里的注意力机制计算公式为:
相 似 度 相 关 度 计 算 公 式 : 注 意 力 权 重 值 计 算 : 最 终 表 示 : 最后是以 r, u 作为接下来模型 output layer 的输入来进行预测。
但可能会存在一个问题,如果 query 的长度也很长,那么压缩成一个向量,其信息的损失不得不考虑进去。
2. Standford Reader[2]

该模型是 Attentive Reader 延伸, 但在 Attention 的部分又有所不同。
首先,模型通过 双向LSTM 分别对 Passage 与 Query 进行Embedding, 对于 Passage, 我们获得一个词的上下文信息矩阵:
; 而对于 Query, 我们获得一个句子级别的向量表示: 。接下来,我们需要计算 Passage 中每个词与 Query的相关度, 然后获得最终输出到output layer 的输出表示:
最后,我们将
输入到 output layer, 然后进行预测:
很明显,该模型更加干净,简洁,且获得的效果是要比 Attentive Reader 好 8-10% 个点的。 我们来简单介绍一下二者的不同:
- 首先,在score部分计算相关度时, Attentive Reader 采用的是 tanh, 而该模型中采用的是MLP, 这样不仅仅效果更好,也更高效。
- 其次, 在 output layer 部分,Attentive Reader 在最终预测之前,采用 tanh 将
与 结合起来; 而Standford Reader 仅仅采用 作为最终预测的输入, 这种用法更加高效。 - 考虑到预测的结果是一个会出现在 Passage 中的实体,因此 Standford Reader 仅在出现的实体范围内进行预测。而 Attentive Reader 会在Passage, Question 中出现所有单词中进行预测。
3. Attention Sum Reader [3]

其实,该模型与上面的Standford Reader 很像,但加了一个小 trick。
首先,采用双向 GRU 分别对 Document 与 Question 进行 Embedding; 对于Document, 我们获得了一个上下文Embedding 矩阵
;对于 Question, 我们获得了一个 sentence-level 句子向量 。然后,计算 Document 中每个词与 Question 的相关度,这里采用点积的方式来做:
最后,考虑到 Document 中同一个词可能会出现多次,因此这里将相同词的注意力权重相加得到该词最终的注意力权重。
是 出 现 在 中 位 置 的 集 合 最后,我们从实体选项中选择 Attention weight 最高的作为答案。
但是,分析一下那个Attention Sum 操作, 其源于作者观察到答案更多偏爱出现次数较多的词,这说明,该 trick 是任务偏好的,并没有很广泛的应用价值, trick 有取巧的嫌疑。
4. Attention-over-Attention [4]

Attention-over-Attention 这篇文章质量很高,在后续的很多模型中都有使用,创新度也很高,值得精读。
首先, 依旧是使用双向RNN(LSTM or GRU) 来获得 Document 与 Query 的上下文表示矩阵:
。然后,我们计算 Pair-wise Matching Score,其实就是计算 Document 中第 i 个词 与 Query 中的第 j 个词的相似度或相关度:
再然后,进行 Individual Attentions, 其实就是对矩阵 M 的每一列做 softmax, 其中,M的一列代表的是对于 Query 中的某个词与所有 Document 中词的相关度, 那么对每一列进行 softmax 的意思就是对于给定的一个 Query 词, 对 Document 中的每个词进行 Attention,这里称之为 query-to-document attention, 公式如下:
; 然后,进行 Attention-over-Attention, 其实就是对矩阵M的每一行做 softmax, 而 M 的一行表示的是对于 Document 中的某个词与所有 Query 中词的相关度,那么对每一行进行softmax 的意思就是对于给定的一个Document 词,对Query 中的每个词进行Attention, 这里称为 document-to-query attention, 公式如下:
然后, 对
求和平均来得到 query-level attention , 从直观上而言,这里是获得对于整个document,每个query的Attention value:最后,我们将
与 做点乘得到 attention document-level attention:最终,Final Predictions 将相同词的score 合并,得到每个词的score, 其实就是Attention-Sum里面提出的创新部分:
本模型可以说是花式Attention的一个典型代表了,其不仅仅考虑了query到document的attention,而且考虑了document 到 query 的attention,于是称为 attention over attention。 虽然无法解释其内部的玄学,但的确该机制在很多后续的模型中都有应用,效果也不错。
5. Gated-Attention Reader [5]

首先,采用双向RNN(GRU) 来获得 Document 与query的上下文表示矩阵,表示如下:
原论文中的图好像画错了,
前不应该是 吗?不过倒是不影响理解。然后,在接下来计算中,我们要不断的迭代 D 与 X:
其中, GA Attention 的计算公式如下:
从直观上看,其实还是不断的融入 query 信息来获得在 document 中与 query 最相关的实体词 。与上述几个模型来比较,该模型是多层的,更能够把握这种相关语义。
这个过程,我们迭代了K次,最终得到了
。在Answer Prediction 阶段,先找到空白处位置的词的表示, 然后与
做内积,再进行softmax:这 个 不 太 懂 最后,再将相同词的概率合并:
6. BiDAF [6]

首先,采用char-level 与 word-level 信息,通过 Highway Networks 融合信息来分别获得 Context 与 Query 的矩阵表示:
为 中 的 单 词 数 为 中 的 单 词 数 然后,通过双向 LSTM 来获得每个词的上下文表示:
的 上 下 文 表 示 ; 的 上 下 文 表 示
核心点: 双向注意力机制
双向注意力机制包括 Context-to-Query 与 Query-to-Context 两大部分:
首先,我们先计算 H 与 U 的相似矩阵:
, 对于context 中的第 个单词与 query 中的第 个单词,有:: 的 第 列 : 的 第 列 **Context-to-query Attention(C2Q):**其含义是对于 Context 中的第
个单词, 我们计算 Query 中的每个单词与该词的相关度,然后进行加权求和将 Query 的信息融合入 Context。我们用
来表示对于单词 的这种相关度:的 第 行 然后我们通过这些相关度信息来将计算 Context 中每个词的新表示:
的 第 列 的 第 列 Query-to-context Attention(Q2C):其本质是计算对于 Query 中的词, Context 中的每个词与它的相关度, 然后通过加权求和将 Context 的信息融入到 Query 中。 而此段中的计算与上述有所不同:
上式的含义是先取 S 中每一列的最大值形成一个新的向量 , 然后对这个新的向量求相关度, 其实意思对于 Query 的整体信息, Context 中每个词对其的相似度分配, 然后我们计算对于Query来说,Context 中的word信息:
然后
重复 T 次形成 T 列, 形成 , 其实就是类似 Q2C 矩阵。 这里有一点疑问的是,为何不像上文一样计算, 是考虑到计算复杂度吗?此时,我们将这些信息综合, 其实就我看来就是将 Query 的信息融入到 Context 中,如下:
其中,
可以选择多种方式,如多层感知机或者仅仅简单的将各个向量连接。
7. DCN [7]
- 同样先通过 LSTM 来分别获得 Context 与 Query 的表示:
可 忽 略
核心: CoAttention Encoder
8. QANet [8]
- 首先,采用char-level 与 word-level 信息,通过 Highway Networks 融合信息来分别获得 Context 与 Query 的矩阵表示:
为 中 的 单 词 数 为 中 的 单 词 数
核心点: 多维信息融合
与 BIDAF 中不同, 其在信息的表示层面做了一个很精巧的融合,采用多个如下图的 Encoder Block 来获得文本的表示:

整个 Encoder Block 的结构是: 卷积层 + Self-Attention 层 + Feed-forward 层。 作者认为,卷积能够捕获文本的局部结构,而 Self-Attention 能够学习到全局的相互特征, 且最大的优点在于二者皆可并行。
最终得到 Context 与 query 的矩阵表示:
Context-Query Attention Layer
Reference
[1] Teaching Machines to Read and Comprehend
[2] A thorough examination of the cnn/dailymail reading comprehension task.
[3] Text understanding with the attention sum reader network
[4] Attention-over-Attention Neural Networks for Reading Comprehension
[5] Gated-attention readers for text comprehension
[6] BI-DIRECTIONAL ATTENTION FLOWFOR MACHINE COMPREHENSION
[7] Dynamic coattention networks for question answering
[8] QANET: COMBINING LOCAL CONVOLUTION WITH GLOBAL SELF-ATTENTION FOR READING COMPREHENSION
阅读理解数据集综述
1. 阅读理解任务定义
阅读理解任务可以被当作是一个有监督学习问题,具体来说,该任务可 以详细描述为:给定一个数据集 T,其中 T 的每一个样本都以下的三元组来表示:
其中,
通俗来讲,阅读理解任务就是通过给定一个文章片段,给定一个问题,要求计算机能够通过文章片段与问题来获得答案。
2. 阅读理解任务类型
阅读理解有多种类型,其划分的一个主要依据是根据答案的类型进行划分,这么区分的主要原因在于答案的不同使得模型输出层,损失函数,评估方式等发生很大变化。
目前来看,阅读理解任务根据具体答案形式的不同可以大致区分为以下四类:
填空式阅读理解。
填空式阅读理解有一个很明显的特点:答案往往是一个单词而非句子。填空式阅读理解任务可以描述为:给定一段文章片段与一个问题,要求机器根据文章片段与问题来推理出合理的答案, 且答案往往是文章片段的某个词。
填空式阅读理解在阅读理解发展的早 期起到了至关重要的作用,现在已经退出主流数据集了,具体典型的数据集 有:CNN&Daily Mail,Who did What等数据集。
抽取式阅读理解。
抽取式阅读理解任务可以描述为:给定一段文章片 段,给定一个问题,要求机器根据该问题从文章片段中找出一个连续的片段作为答案。
考虑到输出问题,此类问题又转化为预测答案的开始与结束的两 个位置
与 。此时,问题就转化成为一个分类问题,答案可以用篇章词片段表示为 。在过去两年中,此类数据集一直是学术界的主流数据集,极大的推动了阅读理解领域的发展,其中最典型的数据集包括 SQuAD,MS Marco,NewsQA,TriviaQA等数据集。
多选式阅读理解。
多选式阅读理解任务可以描述为:给定一段文章片段,给定一个问题,给定多个选项,要求机器根据文章片段与问题从答案选项中选择一个最合适的答案。
通过将阅读理解问题转化为分类问题可以更准 确的评估机器对语言的理解能力,这也是此类数据集强于抽取式数据集的一 大原因。
此类数据集是目前研究人员研究的热点之一,代表性的数据集有 RACE,CLOTH等。
生成式阅读理解。
生成式阅读理解任务可以描述为:给定一段文章片 段,给定一个问题,要求机器基于文章片段与问题生成一个合适的答案,该答案不局限于文章中存在的词语,而是自由生成的。
此类型的阅读理解任务 更适合实际生活场景,但是由于生成的句子无法做准确评估,因此一直无法 成为业界的主流数据集。代表性的数据集有 NARRATIVEQA,CoQA等。




3. 阅读理解任务的评估方式
| 任务类型 | 评估方法 |
|---|---|
| 填空式阅读理解 | 准确率(Accuracy) |
| 抽取式阅读理解 | EM(完全匹配值),F1 |
| 多选式阅读理解 | 准确率(Accuracy) |
| 生成式阅读理解 | BLEU,ROUGE |
对于抽取式阅读理解任务,由于答案通常为一个片段,一般同时采用两
种评估方式:
完全匹配值(Exact Match,EM)。该指标用来判定预测的答案与给 定的答案是否完全相同,即预测的开始位置
与终止位置 是否与真实值相同,其计算公式下:F1 值。该指标主要评估预测的答案片段与正确答案的重合率,其计 算公式如下所示:
4. 现有数据集分类
本节汇集了当前大多数的阅读理解数据集,并对其进行简单描述
1. 填空式阅读理解
考虑到这部分其实已经几乎没人在搞了,因此就不做详细描述了。
| 数据集 | 语言 | 状态 |
|---|---|---|
| MCTest [1] | English | 过时,不推荐研究 |
| CNN/Daily Mail[2] | English | 过时,不推荐研究 |
| CBT[3] | English | 过时,不推荐研究 |
| Quasar-S[4] | English | 过时,不推荐研究 |
- CNN&Daily Mail: 最具代表的数据聚集,数据来源于CNN 和 Daily Mail。
- CBT:数据来源于儿童读物。
2. 抽取式阅读理解
https://www.leiphone.com/news/201903/QcmBwrYSo8QyWXRb.html
| 数据集 | 语言 | 状态 |
|---|---|---|
| SQuAD 1.0 [5] | English | 过时 |
| SQuAD 2.0 [6] | English | 热点 |
| DuReader | Chinese | 热点 |
| MS MARCO | English | 非研究热点,但跟搜索引擎紧密结合 |
| CoQA [9] | English | 热点,接替SQuAD |
| TriviaQA [10] | English | 热点 |
| HotpotQA [11] | English | 热点 |
| Quasar-T [4] | English | 非研究热点 |
| SearchQA[12] | English | 非研究热点 |
| CMRC 2018 | Chinese | 研究热点 |
| CMRC 2019 | Chinese | 热点 |
| NewsQA [13] | English | 有点意思 |
| QuAC [14] | English | 非热点 |
SQuAD 1.0:来源于维基百科,给定 context 于 question, 从 context 中截取一个片段,该片段作为答案。 是一个典型的抽取式问题。
SQuAD 2.0:在 SQuAD 1.0 的基础上新增超过5万无法回答的问题。这要求模型不仅要在能够在问题可回答时给出答案,还要判断哪些问题是阅读文本中没有材料支持的,并拒绝回答这些问题。
DuReader: 中文阅读理解数据集,应该是国内最棒的阅读理解数据集。它的格式跟 下面的 MS MARCO 相似。DuReader中的问题和文档均来自百度搜索和百度知道。答案是人为产生的,而不是原始上下文中的片段。DuReader之所以与众不同,是因为它提供了新的问题类型,例如yes、no和opinion。与事实性问题相比,这些问题有时需要对文档的多个部分进行汇总。
MS MARCO:, 很工业化的数据集,来自Bing 用户查询,因此跟搜索引擎技术紧密相连,十分适合学习。为了克服以前的数据集的弱点,它具有四个主要功能。
首先,所有问题都是从真实用户查询中收集的;
其次,对于每个问题,使用Bing搜索引擎搜索10个相关文档作为上下文;
第三,人为这些问题标注了答案,因此它们不仅限于上下文范围,还需要更多的推理和总结;
最后,每个问题有多个答案,有时甚至冲突,这使得机器选择正确的答案更具挑战性。MS MARCO使MRC数据集更接近真实世界。
CoQA:, 对话式阅读理解数据集,这跟现实生活又近了一步,是现在研究的热点。CoQA包含约8000轮对话,问题的答案有五种类型,分别为Yes、No、Unknown,文章中的一个span和生成式答案。当根据文章和之前的对话信息无法回答当前问题时,答案为Unknown。该数据集不仅提供答案,而且给出了答案的依据,每一种类型的答案的依据都是文章中的一个span。
TriviaQA:。该数据集构造问答对,然后从维基百科等页面中寻找对应的论据。最终通过上述方式构造了约65,000个“问题-答案-论据”三元组,通过这种方式构造的数据集比SQuAD更接近实际使用场景。对比SQuAD数据集,其主要集中于是推理方面的问题,并且实验证明一些在SQuAD上表现良好的模型在TriviaQA上并不能获得理想的结果。
HotpotQA:研究基于多个信息内容的多步推理,然后回答问题。这意味着答案并不仅仅来源于单一文档。
Quasar-T:不建议深入研究。
SearchQA:作者构建该数据集的目的是构建能反映检索系统噪声的阅读理解数据集,作者通爬取 Jeopardy 上的问题,然后将问题作为query 在Google 上检索,获得 answer snippets。 该数据集是通过程序生成的,因此噪声不可避免的比较高,因此不建议深入研究。
NewsQA:该数据集是从CNN新闻网站上构造的,构造方法与SQuAD一致。
QuAC: 对话式阅读理解数据集。
3. 多选式阅读理解
| 数据集 | 语言 | 状态 |
|---|---|---|
| RACE [15] | English | 热点,可研究 |
| CLOTH [16] | English | 一般,已解决 |
| ARC [17] | English | 一般,不推荐 |
| Who did What [18] | English | 过时,不推荐研究 |
| OpenBookQA [19] | English | 一般,不推荐 |
| CommonsenseQA [20] | English | 一般,不推荐 |
| COSMOS QA [21] | English | 一般 |
- RACE: RACE 取自于中国中高考阅读理解题型,我个人认为这是目前最能体现阅读理解能力的数据集之一,十分值得研究。
- CLOTH:来自中文中高考完形填空题型,相较于RACE, CLOTH 天然的适合 BERT 这种 AE 模型来填词,因此 CLOTH 可以说是已经被解决了,准确率比人高。
- ARC:ARC 取自中学生考试中的科学问题,并进一步分为ARC-Challenge 于 ARC-Easy 两个子集,共包含大约8000个问题,此外,该数据集中提供与该任务相关的包含14M科学事实的语料库用来回答这些问题。
- OpenBookQA:包含大约6000个问题,每个问题包括四个选项,此外,与ARC数据集相似,该数据集也提供了参考语料库,包含1326个事实,每个问题期望结合语料库中的某一个事实来得到答案。此外,还需要结合一些常识知识。如何准确的利用参考语料库与常识知识成为了该数据集的主要问题之一。
- CommonsenseQA:来自于ConceptNet,其包含大约12000个需要结合背景知识的问题。在该数据集中,标注者根据ConceptNet中的实体概念来自由构造问题,来使问题包含人类所具有的、但难以在网络资源中检索到的背景知识,故回答问题需要利用问题、候选答案,以及仅仅使用检索策略无法检索到的背景知识。
- COSMOS QA:包含35600个需要常识阅读理解的问题,其专注于解决需要跨越上下文、而不是定位指定片段的推理问题。
4. 生成式阅读理解
生成式阅读理解目前还没有热起来的趋势,相关的数据集也没有进入主流视野,个人不建议做这方面的研究。 这一大原因在于文本生成作为单一的任务迟迟得不到突破,至少目前为止(2020年),看不到突破的影子,个人觉得还需要一些时间。
5. 其他
其他还有一些数据集,如bAbi,LAMBADA, SCT,MCScript,NarrativeQA,DuoRC,CliCR,WikiQA 等,水平有限,累了,就不做赘述了。
最后
本文总结了大多数的数据集,但是并没有对数据集进行详细描述,一来是因为工作量比较大,二来是觉得没有必要。 一般做阅读理解紧跟几个主流数据集就行,太多数据集反而会乱了自身阵脚。
Reference
1. 博客参考
2. 填空式阅读理解
[1] (MCTest) MCTest: A Challenge Dataset for the Open-Domain Machine Comprehension of Text. Matthew Richardson, Christopher J.C. Burges, and Erin Renshaw. EMNLP 2013. paper.
[2] (CNN/Daily Mail) Teaching Machines to Read and Comprehend. Hermann, Karl Moritz, Tomas Kocisky, Edward Grefenstette, Lasse Espeholt, Will Kay, Mustafa Suleyman, and Phil Blunsom. NIPS 2015. paper
[3] (CBT) The Goldilocks Principle: Reading Children’s Books with Explicit Memory Representations. Felix Hill, Antoine Bordes, Sumit Chopra, and Jason Weston. arXiv preprint arXiv:1511.02301 (2015). paper
[4] (Quasar) Quasar: Datasets for Question Answering by Search and Reading. Bhuwan Dhingra, Kathryn Mazaitis, and William W. Cohen. arXiv preprint arXiv:1707.03904 (2017). paper
3. 抽取式阅读理解
[5 ] (SQuAD 1.0) SQuAD: 100,000+ Questions for Machine Comprehension of Text. Pranav Rajpurkar, Jian Zhang, Konstantin Lopyrev, and Percy Liang. EMNLP 2016. paper
[6] (SQuAD 2.0) Know What You Don’t Know: Unanswerable Questions for SQuAD. Pranav Rajpurkar, Robin Jia, and Percy Liang. ACL 2018. paper
[7] (DuReader) DuReader: a Chinese Machine Reading Comprehension Dataset from Real-world Applications. Wei He, Kai Liu, Yajuan Lyu, Shiqi Zhao, Xinyan Xiao, Yuan Liu, Yizhong Wang, Hua Wu, Qiaoqiao She, Xuan Liu, Tian Wu, and Haifeng Wang. ACL 2018 Workshop. paper
[8] (MS MARCO) MS MARCO: A Human Generated MAchine Reading COmprehension Dataset. Tri Nguyen, Mir Rosenberg, Xia Song, Jianfeng Gao, Saurabh Tiwary, Rangan Majumder, and Li Deng. arXiv preprint arXiv:1611.09268 (2016). paper
[9] (CoQA) CoQA: A Conversational Question Answering Challenge. Siva Reddy, Danqi Chen, and Christopher D. Manning. arXiv preprint arXiv:1808.07042 (2018). paper
[10] (TriviaQA) TriviaQA: A Large Scale Distantly Supervised Challenge Dataset for Reading Comprehension. Mandar Joshi, Eunsol Choi, Daniel S. Weld, Luke Zettlemoyer. arXiv preprint arXiv:1705.03551 (2017). paper
[11] (HotpotQA) HotpotQA: A Dataset for Diverse, Explainable Multi-hop Question Answering. Yang Z , Qi P , Zhang S , et al. . 2018.paper
[12] (SearchQA) SearchQA: A New Q&A Dataset Augmented with Context from a Search Engine. Matthew Dunn, Levent Sagun, Mike Higgins, V. Ugur Guney, Volkan Cirik, and Kyunghyun Cho. arXiv preprint arXiv:1704.05179 (2017). paper
[13] (NewsQA) NewsQA: A Machine Comprehension Dataset. Adam Trischler, Tong Wang, Xingdi Yuan, Justin Harris, Alessandro Sordoni, Philip Bachman, and Kaheer Suleman. arXiv preprint arXiv:1611.09830 (2016). paper
[14] (QuAC) QuAC : Question Answering in Context. Eunsol Choi, He He, Mohit Iyyer, Mark Yatskar, Wen-tau Yih, Yejin Choi, Percy Liang, and Luke Zettlemoyer. arXiv preprint arXiv:1808.07036 (2018). paper
3. 多选式阅读理解
[15] (RACE) RACE: Large-scale ReAding Comprehension Dataset From Examinations. Guokun Lai, Qizhe Xie, Hanxiao Liu, Yiming Yang, and Eduard Hovy. EMNLP 2017. paper
[16] (CLOTH) Large-scale Cloze Test Dataset Created by Teachers. Qizhe Xie, Guokun Lai, Zihang Dai, and Eduard Hovy. EMNLP 2018. paper
[17] (ARC) Think you have Solved Question Answering?Try ARC, the AI2 Reasoning Challenge. Peter Clark, Isaac Cowhey, Oren Etzioni, Tushar Khot,Ashish Sabharwal, Carissa Schoenick, and Oyvind Tafjord. arXiv preprint arXiv:1803.05457 (2018). paper
[18] (Who did What) Who did What: A Large-Scale Person-Centered Cloze Dataset Takeshi Onishi, Hai Wang, Mohit Bansal, Kevin Gimpel, and David McAllester. EMNLP 2016. paper
[19] (OpenBookQA) Mihaylov T, Clark P, Khot T, et al. Can a suit of armor conduct electricity? a new dataset for open book question answering[J]. 2018. paper
[20] Talmor A, Herzig J, Lourie N, et al. Commonsenseqa: A question answering challenge targeting commonsense knowledge[J]. 2018. paper
[21] Huang L, Bras R L, Bhagavatula C, et al. Cosmos QA: Machine reading comprehension with contextual commonsense reasoning[J]. arXiv, 2019. paper
其他
[22] (bAbi) Towards AI-Complete Question Answering: A Set of Prerequisite Toy Tasks. Jason Weston, Antoine Bordes, Sumit Chopra, Alexander M. Rush, Bart van Merriënboer, Armand Joulin, and Tomas Mikolov. arXiv preprint arXiv:1502.05698 (2015). paper
[23] (LAMBADA) The LAMBADA Dataset:Word Prediction Requiring a Broad Discourse Context. Denis Paperno, Germ ́an Kruszewski, Angeliki Lazaridou, Quan Ngoc Pham, Raffaella Bernardi, Sandro Pezzelle, Marco Baroni, Gemma Boleda, and Raquel Fern ́andez. ACL 2016. paper
[24] (SCT) LSDSem 2017 Shared Task: The Story Cloze Test. Nasrin Mostafazadeh, Michael Roth, Annie Louis,Nathanael Chambers, and James F. Allen. ACL 2017 workshop. paper
[25] (MCScript) MCScript: A Novel Dataset for Assessing Machine Comprehension Using Script Knowledge. Simon Ostermann, Ashutosh Modi, Michael Roth, Stefan Thater, and Manfred Pinkal. arXiv preprint arXiv:1803.05223. paper
[26] (NarrativeQA) The NarrativeQA Reading Comprehension Challenge.
Tomáš Kočiský, Jonathan Schwarz, Phil Blunsom, Chris Dyer, Karl Moritz Hermann, Gábor Melis, and Edward Grefenstette. TACL 2018. paper
[27] (DuoRC) DuoRC: Towards Complex Language Understanding with Paraphrased Reading Comprehension. Amrita Saha, Rahul Aralikatte, Mitesh M. Khapra, and Karthik Sankaranarayanan. ACL 2018. paper
[28] (CliCR) CliCR: a Dataset of Clinical Case Reports for Machine Reading Comprehension. Simon Suster and Walter Daelemans. NAACL 2018. paper
自然语言推理
上游任务 - 自然语言推理
关系抽取
上游任务 - 关系抽取
https://zhuanlan.zhihu.com/p/77868938
先抽取实体,再判断关系
R-BERT: https://blog.csdn.net/xiaowopiaoling/article/details/105679350, Enriching Pre-trained Language Model with Entity Information for Relation Classification
联合抽取
TPLinker: https://github.com/131250208/TPlinker-joint-extraction, TPLinker: Single-stage Joint Extraction of Entities and Relations Through Token Pair Linking, https://blog.csdn.net/li_jiaoyang/article/details/111315300
https://github.com/weizhepei/CasRel, A Novel Cascade Binary Tagging Framework for Relational Triple Extraction, https://zhuanlan.zhihu.com/p/143591841
实体链接
实体链接
Refernece
Facebook提出生成式实体链接、文档检索,大幅刷新SOTA!
文本摘要
抽取式摘要
https://zhuanlan.zhihu.com/p/79223454
Fine-tune BERT for Extractive Summarization
https://github.com/nlpyang/BertSum
文本生成
文本生成的最新进展
https://zhuanlan.zhihu.com/p/104383357
https://www.jiqizhixin.com/articles/2020-04-14
https://zhuanlan.zhihu.com/p/334374764
关键词抽取
BERT-KPE - Joint Keyphrase Chunking and Salience Ranking with BERT
Methodology
- a chunking network: 识别出有意义的n-grams, 直接采用全连接接网络+softmax判断该n-gram
是否为合适的chunk
- a ranking network:为 phrase 评分
KeyPhrase Extraction
SKE: Span Keyphrase Extraction
Reference
[1] Keyphrase Extraction with Span-based Feature Representations
NP chunking
https://superangevil.wordpress.com/2009/11/20/nltk7_2/
SIFRank: A New Baseline for Unsupervised Keyphrase Extraction Based on Pre-trained Language Model
Abstract
Model Overview
Overall Structure
- 首先先分词,并标注词性
- 采用 NP-chunker(用正则编写) 提取句子中的 NPs
- 用预训练语言模型获取每个 token 的表示
- 分别将document 与 NPs 表示成向量
- 计算NPs embedding 与 document的 cos距离, 选择topk
SIF
通过SIF 来分别获得 NPs 与 document 的 embedding 。
引入了两个平滑项,来解释(1)有些词是在上下文之外出现(2)某些高频词如『the』是没有语境限制的:
: 是标量, 是整个语料库中单词 的词频。
SIFRank
- document d 的embedding 为
- 候选NP的embedding 为
SIF:a simple but tough to beat baseline for sentence embeddings
https://zhuanlan.zhihu.com/p/44534561
https://zhuanlan.zhihu.com/p/111710604
https://blog.csdn.net/qq_42491242/article/details/105381771
核心思想:
- 词频加权: 对组成句子的词进行线性加权,其中每个词的权重为
,其中 是词频, 是超参数。 - **语义无关向量去除:**句子向量的生成要去除文本中与语义无关的向量。具体做法是从数据集中抽样一些句子,然后计算这些句子向量对应的最大的奇异值向量,这样的向量被认为代表了文本中的语法或停用词这些和语义无关的内容。将这些向量去除可以增强文本对语义本身的表达能力。
模型解释
在潜变量生成模型(latent variable generative model)中,语料的生成是一个动态过程,也就是说每个时刻生成一个单词。这个动态过程是由一个话语向量
两个问题:
- 有些在单词上下文之外的词对句向量也是有影响的
- 有些频繁出现的高频词(和,的,and,the等)是对话语本身没有贡献的
开放域对话
开放域对话
tags: NLP
https://zhuanlan.zhihu.com/p/360572095
https://zhuanlan.zhihu.com/p/75009749
https://mp.weixin.qq.com/s/_QY2EhB-TiBcb5q0379McQ
https://zhuanlan.zhihu.com/p/360575335
Reference
多模态命名实体识别
Reference
RpBERT: A Text-image Relation Propagation-based BERT Model for Multimodal NER 2021-2
模型压缩
知识蒸馏
Reference
[1] https://zhuanlan.zhihu.com/p/161930307
[2] knowledge Distillation: A survey
模型压缩 - 综述
Reference
[1] A Survey of Methods for Model Compression in NLP
[2] A Survey of Model Compression and Acceleration for Deep Neural Networks
[3] A Survey of Methods for Low-Power Deep Leaning and Computer Vision
[4] Recent Advances in Efficient Computation of Deep Convolutional Neural Networks
中英文分词
Subword ,你值得拥有
前言
在进入预训练语言模型时代,Subword方法就已经开始大行其道了,虽然目前在英文领域应用广泛,但似乎还没有在中文领域中出现很重量级的 Subword 方法,我个人觉得可以适当探讨一下。因此,我就把最近看过的所有的预训练语言模型中所用的 Subword 方法提取出来,分析了一波,感兴趣的可以看看。
目前来看,方法大致可以分为三种,分别是 BPE[2],WordPiece[1][4],以及SentencePiece[3]。本文先对这三大算法进行论述,然后谈谈中文方向的分词方法发展,最后,在Github上维护一个实现仓库来帮助各位更好的理解。
BPE [2]
中文分词 - BERT-wwm
其实,早在之前就有写文章谈到我个人对于中文分词的看法:深度学习时代,分词真的有必要吗,最近看Subword方法时,又想到中文分词的问题,于是我提了一个小问题:预训练语言模型时代,还需要做分词吗?,希望各位大佬能够分享看法。
BERT-wwm其实从另一个角度阐述了分词的问题,其实其与百度的那篇ERNIE差不多,都是通过 mask 词而非字来实现的。具体的是,如果词中的某个字被mask掉,那么该词需要被完全mask。且相同的是,BERT-wwm与ERNIE都是在BERT已训练好的基础上进行再训练的,其实本质上是词的粒度信息与字的粒度信息的融合,而这似乎是一种很不错的方式。 而这结果再次验证了:不同粒度的信息对于预训练语言模型的提升是有用的。
从 Mask 这种操作来看,分词似乎已经完全没有必要了,当然,如果你想去训练一个中文预训练语言模型的话,那么词粒度的信息似乎是要被考虑进去的。
Reference
[1] BERT,RoBERTa,UNILM:Google’s Neural Machine Translation System:Bridging the Gap Between Human and Machine Translation
[2] GPT 1.0,GPT 2,.0,MASS,XLMs:Neural machine translation of rare words with subword units.
[3] XLNet,ALBERT:Sentencepiece: A simple and language independent subword tokenizer and detokenizer for neural text processing.
[4] Subword regularization: Improving neural network translation models with multiple subword candidates.
[5] BERT-WWM:Pre-Training with Whole Word Masking for Chinese BERT
分词
1. 英文分词
- BPE
- WordPiece
2. 中文分词
3. 中英文混杂
任务型对话
领域分类与意图识别
Reference
[1] BERT for joint intent clasification and slot filing
[2] A multi-task hierarchical approach for intent detection and slot filing
对话管理
Reference
[1] SUMBT: Slot-uterance matching for universal and scalable belief tracking
综述
核心挑战:
- 如何准确理解和识别在复杂业务场景下基于自然语言的用户意图
- 如何解决对训练数据的标注依赖和知识库的结合问题
- 如何解决多模态条件下对话内容的个性化生成
管道方法
包括5个部分:
- 自动语音识别
- 自然语言理解
- 对话管理:对话状态跟踪和对话策略
- 自然语言生成
- 语音合成
1. 自然语言理解
自然语言理解的目的是将用户的输入映射到预先根据不同场景定义的语义槽位中,包括三个任务:
- 领域识别: 分类任务
- 意图识别: 分类任务
- 语义槽位填充: 序列标注任务
主要挑战:
- 模型的领域扩展问题:当用户目标发生变化或话题切换时,NLU将现有的模型快速准确移植到其他领域是非常困难的。
- 缺少语料问题:半监督方法,迁移学习,无监督学习
- 复杂任务下结合知识进行逻辑推理能力:基于常识的知识图谱
- 用户对话自由度高,不能总是输入精确的指令,口语句式参差多变,没有明确,准确的句式
发展趋势:
- SQUAD 2.0 数据集, CoQA 数据集
- 结合上下文进行推断, 对特定领域问题融合外部知识和常识解决
- 采用预训练语言模型
- 多任务学习,迁移学习
2. 对话管理
对话管理控制着整个对话系统的流程。任务主要有:对话状态跟踪和生成对话策略。
对话状态跟踪 - DST
- 基于规则的方法: 有限状态机, N-best 列表
- 基于生成式模型方法:贝叶斯网络,部分可观测马尔可夫模型
- 基于判别式模型,当做分类任务:RNN, LSTM
对话策略 - DPO
3. 自然语言生成
- 基于规则模板/句子规划的方法:人工设定对话场景,根据每个对话场景设计对话模板
- 基于语言模型的方法:
- 基于深度学习的方法
端到端方法
系统评估方法
- 自然语言理解: 分类问题,准确率,召回率和 F-score
- 对话状态跟踪:假设准确率,平均排序倒数,L2范数,平均概率,ROC表现,等误差率和正确接受率
- 对话策略:任务完成率,平均对话轮数
- 自然语言生成:
























